我在其他帖子上看到过类似的问题,但没有一个得到确凿的答案。
我将围绕4个消费者(使用Bunny客户端gem用Ruby编写)来订阅相同的队列并处理消息,所有工作正常,直到消耗大约20,000-40,000个消息。然后消费者只是停止接收消息。连接/频道保持打开状态,服务器仍然识别消费者,但他们只是没有收到消息。
我认为这不是类似主题中提出的预取问题。我已经在各个级别设置了预取,但它并没有解决问题。问题不是单个消费者在其他消息之前获取所有消息 - 而是所有消费者都被停止。
我使用托管的RabbitMQ服务CloudAMQP,所以我认为它可能是一个性能问题,但发布消息仍然正常工作,无论我选择的实例大小如何,我都有同样的问题。在日志中没什么奇怪的。
我应该补充一点,我明确地使用以下命令确认消息:ch.acknowledge(delivery_info.delivery_tag,false)。
我有点难过,非常感谢你的帮助。如果我遗漏了任何重要细节,请告诉我。
一些示例代码:
ch = Bunny.new(connection_parameters).start.create_channel
ch.queue(queue).subscribe(consumer_tag: 'worker', block: true, manual_ack: true) do |delivery_info, _metadata, msg = q.pop|
process_message msg
ch.acknowledge(delivery_info.delivery_tag, false)
end