如何在RabbitMQ/pika中实现优先队列
我想用RabbitMQ实现一个优先级队列。邮件列表建议使用多个队列,每个队列代表一个不同的优先级。
我的问题是,怎么用pika(或者其他的Python库)按照优先级顺序去轮询多个队列呢?
3 个回答
如果你在这个问题被接受后看到它,可能会觉得有点困惑。RabbitMQ有一个插件,可以让你设置一个带优先级的队列。你可以在这里找到这个插件的详细信息:https://github.com/rabbitmq/rabbitmq-priority-queue
之前的答案已经过时了。从 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=...)
我觉得用pika在消费者层面上直接实现这个功能是行不通的,因为所有消费者默认的优先级都是一样的。
我可能会考虑按照邮件列表的建议,设置两个队列,每个队列都有自己的消费者。在每个消费者的回调函数中,我不会直接处理消息,而是把它放到一个优先级队列里,然后调用一个函数,从这个优先级队列中读取优先级最高的消息并进行处理。
还有一个类似的问题,里面的回答也差不多。