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
我究竟做错了什么?