当其他消费者在 RabbitMQ 中可用时,消息堆积在消费者身上 - 使用 bunny for rails

Messages stacking on consumers, when other consumers are available in RabbitMQ - using bunny for rails

RabbitMQ 中的队列消息正在堆叠并等待单个消费者,而其他消费者可用。

我们使用 RabbitMQ 作为我们的信使服务。我们使用 bunny 通过传递消息创建连接和设置队列。

在我们使用 bunny 的 rails 设置中,我们遇到了一个问题,我们有一个队列,其中有 8 个消费者在该队列上侦听消息。当消息进来时,理想情况下它们应该轮询消费者示例:队列中有 4 条消息,消费者 1 接收消息 1,- 消费者 1 忙碌,消费者 2 接收消息 2,消费者 2 忙碌,消费者 3提取消息 3,依此类推。

但是我们遇到的问题是,队列中有 4 条消息,消费者 1 拿起消息 1,消费者 1 忙,消费者 2-8 可用,但消息 2-4 堆积在队列中等待消费者1 可用并处理消息。

我觉得我已经做了很多研究,但还是不太明白如何阻止消息堆积并等待单个消费者。

有没有人有这方面的经验,或者对如何解决这个问题有任何想法?

conn = Bunny.new(bunny[0])
conn.start
ch = conn.create_channel
q = ch.queue("#{record_queue_name}", :durable => true)
q.subscribe(:manual_ack => true, :arguments => {"x-priority" => 10}, :block => true) do |delivery_info, properties, payload|
ch.acknowledge(delivery_info.delivery_tag, false)

我们希望任何时候任何消息被发送到 RabbitMQ,消费者以先到先得的方式接收它们,而不是在其他消息可用时堆叠多条消息等待忙碌的消费者。

编辑: 如何重现: 同时启动 3 个消费者。 推送 6 条消息 - 消费者 1 - 3 现在正忙于处理队列中的 3 条消息。 重启2 & 3,当2 & 3再次监听时,3条消息仍在队列中等待消费者1。消费者2 & 3仍然可用。

重启消费者 1,现在 3 个队列的消息先到先到新重启的消费者 2 和 3 的服务器。

无论消费者是否重启,我都需要先到先得的服务器消息。

RabbitMQ 正在按预期工作。

由于您的代码没有设置 QoS / prefetch,RabbitMQ 将 所有六个 消息发送给您的第一个消费者。由于该消费者需要时间来确认消息(由代码中的 45 秒睡眠模拟),因此这六个消费者保持 "Unacked" 状态,而您的其他两个消费者没有任何工作要做。重新启动其他两个消费者没有任何效果,因为所有六个消息都在 "Unacked" 等待第一个消费者的确认。

当您重启您的第一个消费者时,RabbitMQ 检测到丢失的连接并将六个消息排入 "Ready" 状态,并将所有六个(最有可能)传递给另一个消费者,并且问题重复。

请参阅this runnable code sample了解如何设置预取。在预取 1 的情况下,RabbitMQ 最多会向消费者发送一条消息,并在向该消费者发送另一条消息之前等待确认。这样,消息将分发给您的消费者。


注意: RabbitMQ 团队监控 rabbitmq-users mailing list 并且有时仅在 Whosebug 上回答问题。