访问绑定队列之前发送的交换消息
Accessing exchange messages sent before a queue is bound
我有一个关于 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');
这就是我的问题的根源。教程说:
The messages will be lost if no queue is bound to the exchange yet,
but that's okay for us; if no consumer is listening yet we can safely
discard the message.
有没有办法以某种方式保留这些消息,以便当消费者启动时,它会访问以前发送的消息?我想出的唯一方法是在我的生产者和我的发布者中声明相同的队列,但这有点违背了为不同的消费者进行交换和单独队列的目的。
消费者应该将自己附加到队列,他们不应该声明自己的队列。将队列视为要完成的工作桶。根据工作负载,您可以将 N 个消费者添加到这些队列中以完成工作。
当您创建一个交换器时,您应该有一个或多个队列(工作桶)附加到该交换器。如果这样做,消息将流入队列并开始排队(请原谅双关语)。然后,您的消费者可以在他们准备好并开始工作时附加。
队列需要存在,真的没关系 who/what 创建它们:它可以是生产者(尽管我强烈反对这样做)、消费者、一些仅通过休息创建队列的第三个管理应用程序 api, rabbitmqctl... 如果您想稍后使用队列,只需确保它们是持久的并且消息的 TTL 足够长(如果需要,也可以是持久消息)。但请注意您的队列不会进入流状态。
The only way I figured out how to do it is to declare the same queue
in my producer and my publisher, but it kind of defeats the purpose of
having an exchange and separate queues for different consumers.
首先 - 我想你的意思是 in my producer and my subscriber
:)
其次,消费者的单独队列(或每个消费者的队列)只是在这个例子中。请记住,这是针对扇出交换的,每个消费者都分配一个独占队列——当消费者断开连接时,队列就消失了。这就是 that's okay for us
的原因,因为我们只是在广播,想要广播(消息)的人需要得到它。 Fanout exchange 只是把消息放到它所绑定的所有队列中,仅此而已。
让多个消费者从同一个队列消费是完全可以的 (look at tutorial 2)。
所以你只需要考虑你的用例。当然,创建扇出交换并为消费者预先设置队列是没有意义的……也许您只需要一些路由键或其他东西。
在这个例子(教程 3)中,它提到了消息的广播,如果没有人收到它们,那不是什么大(或小)交易。如果有人想要它们,他们需要得到它们。这就像一个电视频道 - 无论是否有人在看,信号都会继续。
我有一个关于 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');
这就是我的问题的根源。教程说:
The messages will be lost if no queue is bound to the exchange yet, but that's okay for us; if no consumer is listening yet we can safely discard the message.
有没有办法以某种方式保留这些消息,以便当消费者启动时,它会访问以前发送的消息?我想出的唯一方法是在我的生产者和我的发布者中声明相同的队列,但这有点违背了为不同的消费者进行交换和单独队列的目的。
消费者应该将自己附加到队列,他们不应该声明自己的队列。将队列视为要完成的工作桶。根据工作负载,您可以将 N 个消费者添加到这些队列中以完成工作。
当您创建一个交换器时,您应该有一个或多个队列(工作桶)附加到该交换器。如果这样做,消息将流入队列并开始排队(请原谅双关语)。然后,您的消费者可以在他们准备好并开始工作时附加。
队列需要存在,真的没关系 who/what 创建它们:它可以是生产者(尽管我强烈反对这样做)、消费者、一些仅通过休息创建队列的第三个管理应用程序 api, rabbitmqctl... 如果您想稍后使用队列,只需确保它们是持久的并且消息的 TTL 足够长(如果需要,也可以是持久消息)。但请注意您的队列不会进入流状态。
The only way I figured out how to do it is to declare the same queue in my producer and my publisher, but it kind of defeats the purpose of having an exchange and separate queues for different consumers.
首先 - 我想你的意思是 in my producer and my subscriber
:)
其次,消费者的单独队列(或每个消费者的队列)只是在这个例子中。请记住,这是针对扇出交换的,每个消费者都分配一个独占队列——当消费者断开连接时,队列就消失了。这就是 that's okay for us
的原因,因为我们只是在广播,想要广播(消息)的人需要得到它。 Fanout exchange 只是把消息放到它所绑定的所有队列中,仅此而已。
让多个消费者从同一个队列消费是完全可以的 (look at tutorial 2)。
所以你只需要考虑你的用例。当然,创建扇出交换并为消费者预先设置队列是没有意义的……也许您只需要一些路由键或其他东西。
在这个例子(教程 3)中,它提到了消息的广播,如果没有人收到它们,那不是什么大(或小)交易。如果有人想要它们,他们需要得到它们。这就像一个电视频道 - 无论是否有人在看,信号都会继续。