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是存在的。

  1. 当不设置时,会使用系统自带的默认交换机,默认的exchange无法显示的声明绑定队列或解绑队列,也无法删除该exchange。
  2. 消息是发送给exchange的,由exchange通过路由routing_key分配到队列中
  3. 当exchange的type为direct时,且不是默认的exchange时,空字符下的routing_key也会当做一种匹配规则,绑定到队列上,此时实现的跟fanout效果类似