访问绑定队列之前发送的交换消息

时间:2016-10-25 12:34:33

标签: php rabbitmq php-amqplib

我对third RabbitMQ tutorial有疑问。我正在尝试实现类似的功能,但不保证消费者在生产者向交易所发送消息时会运行。

所以,我让我的制作人将消息发布到扇出交换:

$channel->exchange_declare('my_exchange', 'fanout', false, false, false);
$channel->basic_publish('my_message', 'my_exchange');

在我的发布商中,我声明了队列,然后我将其绑定到交易所:

list($queueName,, ) = $channel->queue_declare("", false, false, true, false);
$channel->queue_bind($queueName, 'my_exchange');

这就是我的问题所在的根源。教程说:

  

如果没有队列绑定到交换机,则消息将丢失,   但这对我们没问题;如果没有消费者在听,我们可以放心   丢弃信息。

有没有办法以某种方式保留这些消息,所以当消费者启动时,它会访问先前发送的消息?我想出如何做到这一点的唯一方法是在我的制作人和我的出版商中声明相同的队列,但这有点违背了为不同消费者提供交换和单独队列的目的。

2 个答案:

答案 0 :(得分:3)

队列需要存在,无论是谁/什么创建它们都无关紧要:它可以是制作人(我会强烈反对这一点),消费者,一些第三个管理员应用程序只是通过rest api,rabbitmqctl创建queus。如果您想稍后使用队列,只需确保它们是持久的,并且消息的TTL足够长(如果需要,也是持久消息)。但请注意,您的队列不会进入流状态。

  

我想出如何做的唯一方法是声明相同的队列   在我的制片人和我的出版商,但它有点失败的目的   为不同的消费者提供交换和单独的队列。

首先 - 我想你想说in my producer and my subscriber :)
其次,消费者(或每个消费者的队列)的单独队列就在这个例子中。请记住这是一个扇出交换,每个消费者都会对一个独占队列进行decalres - 当消费者断​​开连接时,队列就会消失。这就是为什么that's okay for us,因为我们只是广播,谁想要广播(消息)需要得到它。扇出交换只是将消息放入绑定到它的所有队列,就是这样。
让多个消费者从同一队列(look at tutorial 2)消费是完全可以的。

所以你只需要考虑你的用例。当然,为消费者创建扇出交换并预先设置queus是没有意义的......也许你只需要一些路由键或其他东西。

在这个例子中(所以教程3),有一个消息的广播,如果没有人得到它们,不是一个大的(或小的)交易。如果有人想要他们,他们需要得到它们。它就像一个电视频道 - 不管有人在看,有没有看到,信号还在继续。

答案 1 :(得分:1)

消费者应该将自己附加到队列中,他们不应该声明自己的队列。将队列视为要完成的工作。根据工作负载,您可以将N个消费者添加到这些队列中以进行工作。

创建交换时,您应该有一个或多个附加到该交换的队列(工作桶)。如果你这样做,消息将流入队列并开始排队(原谅双关语)。然后,您的消费者可以随时准备并开始工作。