RabbitMQ中的优先级是如何实现的

How is priority in RabbitMQ implemented

在幕后,如何以分布式方式将 FIFO 队列转变为优先级队列?他们实际上是在交换底层数据结构,还是 "hacked" 修复

当使用 priority header 发布消息时,具有较高优先级值的消息将置于 queue 的头部。这是通过实际交换 queue 中的消息来完成的。这一切都是在 queue 中等待消息被消费时完成的。为了让 RabbitMQ 真正确定消息的优先级,请将消费者的 basic.qos 设置得尽可能低。因此,如果消费者连接到未设置 basic.qos 且随后向其发布消息的空 queue,则消息可能根本不会在 queue 中等待。在这种情况下,优先级 queue 将不会有任何机会优先处理它们。

参考:https://www.rabbitmq.com/priority.html

底层数据结构是多个队列,每个队列分配一个优先级。每个队列都是一个 Erlang VM 进程。这就是为什么不建议使用超过 10 个左右的优先级,因为性能会受到影响。如果你的负载足够轻,这可能是可以接受的。


注意: RabbitMQ 团队监控 rabbitmq-users mailing list 并且有时只在 Whosebug 上回答问题。