2

我有一个关于第三个 RabbitMQ 教程的问题。我正在尝试实现类似的东西,除了不能保证消费者在生产者向交易所发送消息时正在运行。

所以,我有我的生产者将消息发布到扇出交换:

$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');

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

如果没有队列绑定到交换器,消息将丢失,但这对我们来说没关系;如果没有消费者在监听,我们可以安全地丢弃消息。

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

4

2 回答 2

3

队列需要存在,谁/什么创建它们并不重要:它可以是生产者(尽管我强烈反对这样做),消费者,只是通过rest api创建队列的第三个管理应用程序,rabbitmqctl ...如果你以后想要使用队列,只需确保它们是持久的并且消息的 TTL 足够长(如果需要,也可以是持久消息)。但请注意,您的队列不会进入流动状态。

我想出如何做到这一点的唯一方法是在我的生产者和发布者中声明相同的队列,但这有点违背了为不同消费者提供交换和单独队列的目的。

首先 - 我想你的意思是说in my producer and my subscriber:)
其次,消费者的单独队列(或每个消费者的队列)只是在这个例子中。请记住,这是用于扇出交换,并且每个消费者都标记了一个独占队列 - 当消费者断​​开连接时,队列就消失了。这就是为什么that's okay for us,因为我们只是在广播,而想要广播(消息)的人需要得到它。扇出交换只是将消息放入绑定到它的所有队列中,仅此而已。
让多个消费者从同一个队列消费是完全可以的(参见教程 2)。

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

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

于 2016-10-25T21:28:53.753 回答
1

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

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

于 2016-10-25T18:01:41.637 回答