我有多个消费者在同一个队列上进行轮询,并且每隔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
所以我不知道是否包含循环提取用于此类用法
答案 0 :(得分:2)
1.如果同时至少有两个消费者可以得到相同的消息吗?
否 - 只会将单个消息传递给单个消费者。
正因为如此,你的情景#2根本没有发挥作用。
除非您nack
将消息重新发送到队列但仍继续处理,否则您永远不会有2位消费者处理同一条消息。