RabbitMQ:清空队列

3
我有一些队列,例如:
online_queue = self._channel.queue_declare(
                                   durable = True,
                                   queue = 'online'
                                   )

目前,我需要刷新此队列中的所有内容。但是,在这个时候,可能会有另一个进程发布到这个队列。如果我使用channel.queue_purge(queue='online'),在队列被清空期间发布的消息会发生什么?

2个回答

2
根据你的最终目标,你也许可以通过使用临时队列来解决这个问题。
为了更清晰地表述,我们需要给一些名字。把你当前想要清空的队列称为队列A,并假设它与交换机A是1-1绑定的。
如果你创建一个新队列(队列B)并以与队列A相同的方式将其绑定到交换机A上,那么从绑定时刻起,队列B将会接收到队列A接收到的所有消息。
现在你可以安全地清空队列A,而不会丢失任何在队列B绑定后发送的消息。
重新将队列A绑定到交换机A上,然后就可以重新开始运行了。
你可以按照需要处理队列B中的“中间”消息。
这种方法具有非常明确定义的行为,并且不会导致任何竞争条件,因为你可以完全清空并重新创建队列A,而不是仅仅清空队列。

0

你正在描述一种竞态条件。有些可能仍然在队列中,而其他一些可能被清除。或者所有的都会被清除。或者没有一个会被清除。

因为这是一种时间相关的情况,所以根本无法确定。您应该重新审查清除仍处于活动状态的队列的需求,或者构建一个更强大的消费者,可以接受连接到的队列中可能存在消息(这基本上就是消费者必须面对的问题)。


是的,我了解竞态条件,我的意思是说RMQ内部是否有任何反“竞态条件”的防御措施,或者这完全取决于程序员的责任? - Mikhail
我不知道有什么可以帮助防止这种竞态条件的东西,无论是在AMQP标准中还是在RabbitMQ中。 - Brian Kelly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接