RabbitMQ和Python 3:如何使用优先级来自不同队列的消息

时间:2017-10-30 14:08:29

标签: python python-3.x rabbitmq queue pika

我有两种类型的任务task1和task2;我也有两种类型的消费者ConsumerA和ConsumerB。

ConsumerA只能处理任务类型task1。 ConsumerB可以处理两种类型的任务:task1和task2。

我希望ConsumerA只处理任务类型task1。

我希望ConsumerB首先处理任务类型task2,并且只有在没有任务type2时才处理任务类型task1。

如何使用RabbitMQ设计此解决方案。我考虑使用两个队列,但我不知道如何确保它只在没有任务类型1时处理任务类型2。

我已经阅读了所有StackOverflow而没有任何成功。

也许有人解决了这个任务?

1 个答案:

答案 0 :(得分:0)

你好@Dima Voronenkov

您可能需要查看RabbitMQ文档中的Priorities QueuesRound-robin dispatching

两者都可以为每个工作人员创建一个队列,并将task1分发到两个队列,并处理优先级高于task2的{​​{1}}。

如果这种方法符合您的要求,可以进一步扩展。

RoundRobin方法的图形说明:

Ex

编辑1 :为了避免task1 ConsumerB 筹集资金,您可以分配到task1一个time to live,以便他们“expire”并将它们发送到“dead-letter-queue”,实际上指向ConsumerA队列,因此当ConsumerB忙时,这些task1消息将被重定向到另一个队列。

超越,你也可以给 ConsumerA 队列提供​​“更多门票”,至少在RR标准定义中,我不知道如何在RabbitMQ上做到这一点,但是可以实现创造更多 ConsumerA 就像队列一样,将它们分组到同一个队列中。

方法2

使用主题(查看底部的链接)和priorities也可能是一个很好的解决方案,但是我没有在同一个练习中测试过,我看不出为什么它不起作用,请查看下图:

ex2

在这种情况下,一次交换只需要一个队列,而ConsumerA只会消耗task1条消息,而ConsumerB会消耗两条消息,优先级为task1

主题:https://www.rabbitmq.com/tutorials/tutorial-five-python.html