我有两种类型的任务task1和task2;我也有两种类型的消费者ConsumerA和ConsumerB。
ConsumerA只能处理任务类型task1。 ConsumerB可以处理两种类型的任务:task1和task2。
我希望ConsumerA只处理任务类型task1。
我希望ConsumerB首先处理任务类型task2,并且只有在没有任务type2时才处理任务类型task1。
如何使用RabbitMQ设计此解决方案。我考虑使用两个队列,但我不知道如何确保它只在没有任务类型1时处理任务类型2。
我已经阅读了所有StackOverflow而没有任何成功。
也许有人解决了这个任务?
答案 0 :(得分:0)
你好@Dima Voronenkov
您可能需要查看RabbitMQ文档中的Priorities Queues和Round-robin dispatching。
两者都可以为每个工作人员创建一个队列,并将task1
分发到两个队列,并处理优先级高于task2
的{{1}}。
如果这种方法符合您的要求,可以进一步扩展。
RoundRobin方法的图形说明:
编辑1 :为了避免task1
为 ConsumerB 筹集资金,您可以分配到task1
一个time to live,以便他们“expire”并将它们发送到“dead-letter-queue”,实际上指向ConsumerA队列,因此当ConsumerB忙时,这些task1
消息将被重定向到另一个队列。
超越,你也可以给 ConsumerA 队列提供“更多门票”,至少在RR标准定义中,我不知道如何在RabbitMQ上做到这一点,但是可以实现创造更多 ConsumerA 就像队列一样,将它们分组到同一个队列中。
方法2
使用主题(查看底部的链接)和priorities也可能是一个很好的解决方案,但是我没有在同一个练习中测试过,我看不出为什么它不起作用,请查看下图:
在这种情况下,一次交换只需要一个队列,而ConsumerA只会消耗task1
条消息,而ConsumerB会消耗两条消息,优先级为task1
。
主题:https://www.rabbitmq.com/tutorials/tutorial-five-python.html