Rabbitmq一个队列多个消费者

时间:2016-09-05 21:20:17

标签: python python-2.7 rabbitmq pika

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

问题是:
1.如果同时至少有两个消费者能得到同样的信息吗?

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

Consumer1使用带有basic.get的msg,在它到达basic_ack行之前,Consumer2也收到此消息(basic.get),现在Consumer1到达basic.ack,只有现在Consumer2到达自己的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

所以我不知道是否包含循环提取用于此类用法

1 个答案:

答案 0 :(得分:2)

  

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

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

正因为如此,你的情景#2根本没有发挥作用。

除非您nack将消息重新发送到队列但仍继续处理,否则您永远不会有2位消费者处理同一条消息。

相关问题