1

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 的服务器。

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

4

1 回答 1

2

RabbitMQ 正在按预期工作。

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

当您重新启动第一个使用者时,RabbitMQ 检测到丢失的连接并将六条消息排入“就绪”状态,并将所有六条消息(最有可能)传递给另一个使用者,并且问题重复出现。

请参阅此可运行代码示例了解如何设置预取。如果预取为1,RabbitMQ 最多将向消费者传递一条消息,并在向该消费者传递另一条消息之前等待确认。这样,消息将在您的消费者之间分发。


注意: RabbitMQ 团队会监控rabbitmq-users 邮件列表,有时只会在 StackOverflow 上回答问题。

于 2019-07-31T13:05:24.333 回答