提问者:小点点

当其他消费者在 RabbitMQ 中可用时,消息堆叠在消费者身上 - 使用 bunny 作为轨道


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

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

在使用 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

重新启动使用者 1,现在 3 队列消息首先到达新重新启动的使用者 2 的服务器

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


共1个答案

匿名用户

RabbitMQ 正在按预期工作。

由于您的代码没有设置 QoS/预取,RabbitMQ 会将所有六条消息发送给您的第一个消费者。由于该使用者需要时间来确认消息(由代码中的 45 秒睡眠模拟),因此这六个使用者仍处于“未确认”状态,而您的其他两个使用者没有任何工作要处理。重新启动其他两个使用者不起作用,因为所有六条消息都处于“未确认”状态,等待来自第一个使用者的确认。

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

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

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