5

RabbitMQ 提供了一个Priority Queue,其中消息可能具有优先级并以相反的优先级传递给消费者。

使用Bunny gem,我创建了一个优先队列。然后,我发布了 5 条没有优先级的消息,以及 2 条优先级为 1 的消息,并检查了我的消费者日志。不幸的是,我的消费者告诉我它处理 5 条无优先级消息,然后处理 2 条优先级消息。通过添加睡眠,我确保每条消息至少需要 2 秒的时间来处理。我频道的预取也设置为 1。这是我使用的示例代码

require "bunny"
require "logger"

logger = Logger.new(STDERR)
bunny = Bunny.new(ENV["AMQP_URL"], logger: logger)
bunny.start
at_exit { bunny.stop }

channel = bunny.channel
channel.prefetch 1

routing_key = "build-show-report"
exchange = channel.exchange("signals", passive: true)
queue = channel.queue("signal.#{routing_key}", durable: true, arguments: {"x-max-priority" => 3})
queue.bind(exchange, routing_key: routing_key)
queue.subscribe(manual_ack: true, block: false) do |delivery_info, properties, payload|
  logger.info "Received #{payload}"
  sleep 2

  channel.acknowledge(delivery_info.delivery_tag, false)
end

5.times {|n| exchange.publish(n.to_s, routing_key: "build-show-report")}
2.times {|n| exchange.publish((10*n).to_s, routing_key: "build-show-report", priority: 1)}

sleep 30

我希望看到第一个低优先级消息,然后是 2 个高优先级消息,然后是剩下的低优先级消息。

似乎忽略了priority选项。#publish我究竟做错了什么?

4

1 回答 1

1

最可能的原因在“与消费者的交互”部分的文档中提到:立即传递给消费者而不首先访问消息存储的消息没有优先级。

于 2016-04-05T12:34:35.443 回答