3

我有一些队列,等等:

online_queue = self._channel.queue_declare(
                                   durable = True,
                                   queue = 'online'
                                   )

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

4

2 回答 2

2

根据您的最终目标,您也许可以通过使用临时队列来解决此问题。

为了让事情更清楚,让我们给事情一些名字。调用当前队列(要清除的队列)队列 A,并假设它是 1-1 绑定到 Exchange A。

如果您创建一个新队列(队列 B)并以与队列 A 绑定相同的方式将其绑定到 Exchange A,则队列 B 现在将获取队列 A 获取的所有消息(从绑定时开始)。

您现在可以安全地清除队列 A,而不会丢失在队列 B 绑定后发送的任何消息。

将队列 A 重新绑定到 Exchange A,您就可以备份并运行了。

然后,您可以根据需要处理队列 B 中的“临时”消息。

This has the advantage of having a very well defined behavior and doesn't get you into any race conditions because you can completely blow Queue A away and re-create it instead of purging.

于 2012-02-14T15:12:01.437 回答
0

您正在描述竞争条件。有些可能会留在队列中,有些可能会被清除。或者他们都将被清除。或者他们都不会被清除。

只是没有办法说,因为这是一个时间依赖的情况。您应该重新检查是否需要清除仍处于活动状态的队列,或者构建一个更强大的消费者,以忍受它正在连接的队列中可能有消息的事实(这基本上是消费者必须忍受的) , 反正)。

于 2011-11-25T23:57:26.940 回答