RabbitMQ的PHP教程之Routing (四)

关于这一篇的教程,主要是针对Route Key的使用。在第二篇的文章中,我们使用direct类型的exchange实现工作队列。在这个基础之上,我们再进行一个扩展:即一个队列绑定多个route key,这样绑定多个route key的队列就能接收到不同route key的消息。但有一点是固定不变的,就是一个message只能有一个route key.

一个message最多只能有一个route key ,一个queue可以绑定多少个route key

举个实际的使用场景,日志系统(引用官方),假设产生一条日志的级别有debug, info, notice, warning, error, critical, alert, emergency八种级别(按照psr-3的日志标准,日志的级别有8个),我们希望日志消息发送到exchange后,warning, error, critical, alert, emergency转发到queue.log.error队列,notice转发到queue.log.notice队列,debug、info转发到queue.log.debug中。

此时需要使用到queue与多个route之间的绑定。

send.php

$channel = new \AMQPChannel($conn);
$channel->qos(0,0);

$exchange = new \AMQPExchange($channel);
$exchange->setName('exchange.logs');
$exchange->setType(AMQP_EX_TYPE_DIRECT);
$exchange->setFlags(AMQP_DURABLE);
$exchange->declareExchange();

$logs =[
    'debug' =>'message [debug]',
    'info' =>'message [info]',
    'notice' =>'message [notice]',
    'warning' =>'message [warning]',
    'error' =>'message [error]',
    'critical' =>'message [critical]',
    'alert' =>'message [alert]',
    'emergency' =>'message [emergency]'
];
foreach ($logs as $routeKey => $log) {
    $result = $exchange->publish($log, $routeKey);
    var_dump($result);
}

receive.php

$channel = new \AMQPChannel($conn);
$channel->qos(0,1);

$queue = new \AMQPQueue($channel);
$queue->setName("queue.log.error");
$queue->setFlags(AMQP_DURABLE);
$queue->declareQueue();
$queue->bind('exchange.logs','warning');
$queue->bind('exchange.logs','error');
$queue->bind('exchange.logs','critical');
$queue->bind('exchange.logs','alert');
$queue->bind('exchange.logs','emergency');
$queue->consume('processMessage',AMQP_AUTOACK);

function processMessage($envelope, $queue) {
    global $i;
    echo "Message $i: " . $envelope->getBody() . "\n";
    $i++;
}

其实从receive.php中可以看出,该文章要表达的中心思想,queue其实是可以bind多少个key.

我们也可以温故一下exchange、queue、routeKey、message之间的对应关系。

  1. 同一个exchange可以bind多少queue,当然同一queue也可以绑定不同的exchange => N对N关系
  2. 同一个routeKey可以绑定多个message,但同一个message只能指定一个routeKey,或者不指定(fanout类型) => 1对N的关系
  3. 同一个queue可以绑定多少个routeKey,同一个routeKey也可以指定多个queue => N对N关系

 相关阅读:

  1. RabbitMQ的原理与操作示例
  2. RabbitMQ AMQP 消息模型攻略
  3. PHP中的AMQP类
  4. RabbitMQ的PHP教程之入门 (一)
  5. RabbitMQ的PHP教程之工作队列 (二)
  6. RabbitMQ的PHP教程之发布/订阅(三)
  7. RabbitMQ的PHP教程之Routing (四)
  8. RabbitMQ的PHP教程之topic (五)
  9. RabbitMQ的PHP教程之RPC (六)

RabbitMQ的PHP教程之Routing (四)》上有1条评论

  1. Pingback引用通告: RabbitMQ的PHP教程之topic (五) | 精彩每一天

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>