rabbitmq你该知道的秘密 - exchange可以不设置吗
exchange可以不设置吗
实践
用send_batch.php
发送消息,通过rabbit manage 查看默认的交换机的消息发送速率图的变化
使用direct实现fanout的效果
查看例子:send_fanout_by_direct.php
git地址:https://github.com/xiaochengfu/rabbitmq-tutorials/blob/develop/php/send_fanout_by_direct.php
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
$connection = new AMQPStreamConnection('59.110.213.203', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->exchange_declare('FM_DIRECT', 'direct', false, false, false, false);
for ($i = 1; $i <= 5; $i++) {
$channel->queue_declare('FM_STUDY_' . $i, false, false, false, false);
$channel->queue_bind('FM_STUDY_' . $i, 'FM_DIRECT');
}
$msg = new AMQPMessage('好好听讲!');
$channel->basic_publish($msg, 'FM_DIRECT');
echo " [x] Sent '好好听讲!'\n";
$channel->close();
$connection->close();
提示:虽然都能实现广播的功能,但广播的场景,还是推荐使用fanout,因为效率会更高,direct还是会解析空的routing_key,而fanout会自动忽略routing_key,直接往绑定的队列里扔消息
答案
可以不设置,但exchange是存在的。
- 当不设置时,会使用系统自带的默认交换机,默认的exchange无法显示的声明绑定队列或解绑队列,也无法删除该exchange。
- 消息是发送给exchange的,由exchange通过路由routing_key分配到队列中
- 当exchange的type为direct时,且不是默认的exchange时,空字符下的routing_key也会当做一种匹配规则,绑定到队列上,此时实现的跟fanout效果类似
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
评论已关闭