RabbitMQ: 清空队列
我有一个队列,比如这样:
online_queue = self._channel.queue_declare(
durable = True,
queue = 'online'
)
现在,我需要清空这个队列里的所有内容。但是,这个时候,可能还有其他的程序在往这个队列里发送消息。如果我使用channel.queue_purge(queue='online')来清空队列,那么在清空操作进行的过程中,如果有新的消息被发送到这个队列,会发生什么呢?
2 个回答
2
根据你的最终目标,你可能可以通过使用一个临时队列来解决这个问题。
为了让事情更清楚,我们给这些东西起个名字。把你现在的队列(你想要清空的那个)叫做队列A,假设它是和交换机A一一对应的。
如果你创建一个新的队列(队列B),并且把它和交换机A绑定,就像队列A那样,队列B现在会接收到所有在绑定时之后发送到队列A的消息。
这样,你就可以安全地清空队列A,而不会丢失在队列B绑定后发送的任何消息。
然后,把队列A重新绑定到交换机A,你就可以继续正常工作了。
接下来,你可以根据需要处理队列B中的“临时”消息。
这样做的好处是行为非常明确,而且不会出现竞争条件,因为你可以完全删除队列A并重新创建它,而不是简单地清空它。
0
你在描述一个竞争条件。可能有些消息会留在队列里,有些则可能被清除掉。也可能所有的消息都会被清除,或者一个都不会被清除。
这完全无法预测,因为这是一个与时间有关的情况。你应该重新考虑一下,是否真的需要清除一个仍在使用中的队列,或者可以考虑建立一个更强大的消费者,让它能够接受在连接的队列中可能还有消息(这其实也是消费者必须面对的现实)。