php rabbitmq topic 交换机

Topic exchange

发送到一个话题交换机(topic exchange)信息,不能是任意routing_key -它必须是一个单词的列表,用逗号分隔。这些词可以是任何东西,但通常它们指定连接到消息的某些特性。一些有效的路由键的例子:stock.usd.nysenyse.vmw"quick.orange.rabbit"。在你喜欢的路由键中,最多可以有255个字节的单词。

绑定键也必须是相同的形式。主题交换背后的逻辑类似于一个直接的消息,用特定的路由键发送的消息将被发送到绑定到绑定键的所有队列中。但是有两个重要的绑定键的特殊情况:

*(星号)可以代替一个词。
#(哈希)可以代替零个或更多的单词。

在一个例子中解释这一点是最容易的:

在这个示例中,我们将发送所有描述动物的消息。消息将用一个包含三个单词(两个点)的路由键发送。路由键中的第一个字将描述速度,第二个颜色和第三个种:<speed>.<colour>.<species>

我们创建三的绑定:Q1绑定绑定键*.orange.* 和 Q2 with *.*.rabbit 和 lazy.#

这些绑定可以概括为:

Q1对所有的橙色(orange)动物很感兴趣。
Q2想听关于兔子(rabbits)的一切,关于懒惰(lazy)动物的一切。

带有quick.orange.rabbit的路由键的消息将传送到两个队列中。信息lazy.orange.elephant也将去他们俩。另一方面,quick.orange.fox只会进入第一排,而lazy.brown.fox只到第二个。lazy.pink.rabbit将被送到第二个队列只有一次,即使它匹配两个绑定。quick.brown.fox不匹配任何绑定,所以它将被丢弃。

如果我们违背合同,用一个或四个词,如orangequick.orange.male.rabbit?那么,这些消息将不匹配任何绑定并将丢失。

另一方面,lazy.orange.male.rabbit,即使它有四个词,将匹配最后的绑定,并将交付给第二个队列。

1.生产者

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2020/5/31
 * Time: 15:29
 */
require_once  'vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Exchange\AMQPExchangeType;
use PhpAmqpLib\Message\AMQPMessage;

$exchange = 'topic_logs';
$connection = new AMQPStreamConnection('192.168.1.103', 5672, 'zyw', '123456', '/');
$channel = $connection->channel();
$channel->exchange_declare($exchange, 'topic', false, false, false);
for($i=0;$i<10;$i++) {
    if ($i%2==0) {
        $routing_key="abc.error.info";
    } else {
        $routing_key="abc.success";
    }
    $data= array('name'=>'zyw'.$i,'time'=>time(),'i'=>$i);
    $msg = new AMQPMessage(json_encode($data));
    $channel->basic_publish($msg, 'topic_logs', $routing_key);
    echo " [x] Sent ",$routing_key,':'," \n";
}
$channel->close();
$connection->close();

2.消费者

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2020/5/31
 * Time: 15:30
 */
require_once  'vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Exchange\AMQPExchangeType;
use PhpAmqpLib\Message\AMQPMessage;
$exchange = 'topic_logs';
$connection = new AMQPStreamConnection('192.168.1.103', 5672, 'zyw', '123456', '/');
$channel = $connection->channel();
$channel->exchange_declare($exchange, 'topic', false, false, false);
$queue_name = "topic";
$channel->queue_declare($queue_name, false, false, true, false);
$binding_keys = ["abc.*","abc.#"];
foreach($binding_keys as $binding_key) {
    $channel->queue_bind($queue_name, 'topic_logs',$binding_key);
}
$callback = function($msg){
    echo ' [x] ',$msg->delivery_info['routing_key'], ':', $msg->body, "\n";
};
$channel->basic_consume($queue_name, '', false, true, false, false, $callback);
while(count($channel->callbacks)) {
    $channel->wait();
}
$channel->close();
$connection->close();
<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2020/5/31
 * Time: 15:59
 */
require_once  'vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Exchange\AMQPExchangeType;
use PhpAmqpLib\Message\AMQPMessage;
$exchange = 'topic_logs';
$connection = new AMQPStreamConnection('192.168.1.103', 5672, 'zyw', '123456', '/');
$channel = $connection->channel();
$channel->exchange_declare($exchange, 'topic', false, false, false);
$queue_name = "topic2";
$channel->queue_declare($queue_name, false, false, true, false);
$binding_key="abc.#";
$channel->queue_bind($queue_name, 'topic_logs', $binding_key);
$callback = function($msg){
    echo ' [x] ',$msg->delivery_info['routing_key'], ':', $msg->body, "\n";
};
$channel->basic_consume($queue_name, '', false, true, false, false, $callback);
while(count($channel->callbacks)) {
    $channel->wait();
}
$channel->close();
$connection->close();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值