如何在RabbitMQ/pika中实现优先队列

8 投票
3 回答
9576 浏览
提问于 2025-04-17 04:10

我想用RabbitMQ实现一个优先级队列。邮件列表建议使用多个队列,每个队列代表一个不同的优先级。

我的问题是,怎么用pika(或者其他的Python库)按照优先级顺序去轮询多个队列呢?

3 个回答

4

如果你在这个问题被接受后看到它,可能会觉得有点困惑。RabbitMQ有一个插件,可以让你设置一个带优先级的队列。你可以在这里找到这个插件的详细信息:https://github.com/rabbitmq/rabbitmq-priority-queue

14

之前的答案已经过时了。从 rabbitmq 3.5.0 开始,RabbitMQ 原生支持优先级队列:

从版本 3.5.0 开始,RabbitMQ 在核心中实现了优先级队列。任何队列都可以通过客户端提供的可选参数转变为优先级队列。

pika 1.1.0 版本中,这个功能也可以使用:

class pika.spec.BasicProperties(content_type=None, content_encoding=None, headers=None, delivery_mode=None, priority=None, correlation_id=None, reply_to=None, expiration=None, message_id=None, timestamp=None, type=None, user_id=None, app_id=None, cluster_id=None)

使用这个功能的代码可能看起来像这样:

channel.basic_publish(properties=pika.BasicProperties(priority=your_priority),
                      exchange=...,
                      routing_key=...,
                      body=...)
4

我觉得用pika在消费者层面上直接实现这个功能是行不通的,因为所有消费者默认的优先级都是一样的。

我可能会考虑按照邮件列表的建议,设置两个队列,每个队列都有自己的消费者。在每个消费者的回调函数中,我不会直接处理消息,而是把它放到一个优先级队列里,然后调用一个函数,从这个优先级队列中读取优先级最高的消息并进行处理。

还有一个类似的问题,里面的回答也差不多。

撰写回答