【问题标题】:Rabbitmq one queue multiple consumersRabbitmq 一个队列多个消费者
【发布时间】:2016-09-05 21:20:17
【问题描述】:

我有多个消费者在同一个队列上轮询,并且每隔 X 秒检查一次队列,基本上在 X 秒之后,可能至少有两个消费者可以同时启动 basic.get

问题是:
1.如果至少有两个消费者同时可以得到相同的消息?

2.据我了解只有basic_ack会从队列中删除一条消息,所以假设我们有以下场景:

Consumer1 使用 basic.get 接收 msg,在到达 basic_ack 行之前,Consumer2 也收到此消息 (basic.get),现在 Consumer1 到达 basic.ack,现在才到达 @987654329 @ 达到自己的basic.ack
当 Consumer2 到达其basic.ack 时会发生什么?
消息是否也会由 Consumer2 处理,因为操作不是原子的?

我的消费者使用python pika的代码逻辑如下:

while true: m_frame =None while(m_frame is None):
self.connection.sleep(10) m_frame,h_frame,body = self.channel.basic_get('test_queue') self.channel.basic_ack(m_frame.delivery_tag) [Doing some long logic - couple of minutes]

请注意,我不使用 basic.consume

所以我不知道这种用法是否包含循环提取

【问题讨论】:

    标签: python python-2.7 rabbitmq pika


    【解决方案1】:

    1.如果至少有两个消费者同时可以得到相同的消息?

    否 - 一条消息只会传递给单个消费者。

    因此,您的场景 #2 根本没有发挥作用。

    您永远不会有 2 个消费者处理同一条消息,除非您 nack 将消息返回到队列但仍继续处理它。

    【讨论】: