如何使用Bunny gem优先向RabbitMQ发布消息

Fra*_*eil 5 bunny

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

使用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
Run Code Online (Sandbox Code Playgroud)

我预计会看到第一个低优先级消息,然后是 2 个高优先级消息,然后是其余的低优先级消息。

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

Mic*_*hin 1

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