RabbitMQ - 按优先级

时间:2017-09-13 10:01:10

标签: rabbitmq amqp priority-queue consumer producer

我需要升级我们的生产者/消费者基础设施。

当前设置如下所示:

  • 具有不同优先级(低,中,高)的3个队列的集合。
  • 当我们的客户生成任务(即处理图像)时:
    • Producer将消息添加到相关队列。
    • 其中一名工人致辞。

这种方法的问题在于,如果客户生成大量任务,它可以占用队列中的所有可用插槽,这可能导致该队列中的服务拒绝(或大量延迟)。

建议的更改:

  • 每个客户(或一组)应该有专门的消费者(或一组)。
  • 当消费者闲置时,他们应该处理其他客户的问题。消息。

例如,我们有一组消息:

 1. Producer: Customer1, Queue: High, Payload: {}, Created: Today 16:00:00
 2. Producer: Customer2, Queue: High, Payload: {}, Created: Today 16:00:01
 3. Producer: Customer1, Queue: High, Payload: {}, Created: Today 16:00:02
 4. Producer: Customer1, Queue: High, Payload: {}, Created: Today 16:00:03

我们有以下消费者:

1. Consumer1: Dedicated for Customer1
2. Consumer2: Dedicated for Customer1
3. Consumer3: Dedicated for Customer2

预期结果:

1. Consumer1 will address Message#1
2. Consumer2 will address Message#2
3. Consumer3 will address Message#3
4. Message#4 Any of the Consumers can address it, since Consumer1/3 are dedicated to the given Producer and Consumer2 will be idle.

总结一下,客户应该尽快获得专门的消费者(或更多可用的消费者),无论何时无事可做,消费者都可以消费其他客户的其他消息。

我试图弄清楚实现这一目标的最佳方法是什么,即使从RabbitMQ切换到任何其他消息代理也是如此。

到目前为止,我发现(使用RabbitMQ)的唯一方法是使用federate queues并形成一个完整的双向图(每个队列都是所有其他队列的上游,反之亦然)。

1 个答案:

答案 0 :(得分:0)

没有一种公式可以为每种类型的工作负载产生 fair 排队;重要的是要多少,多少统一以及需要多长时间来处理任务。就是说,我怀疑联邦队列对公平性是否会有帮助。

您可以使用priority queuesconsumer priorities。结合较低的prefetch计数,可以实现符合客户期望的计划。

但是,这些机制都不会根据客户的已用容量来限制您的客户;如果一个客户在短时间内发送了太多高优先级的缓慢处理任务,它仍然会阻止您的其他客户。

由于您建议每位客户可能有一位消费者,所以我了解到客户数量并不是很大。要考虑的解决方案是按客户设置优先级队列。所有这些队列中的消息都可以由多个工作程序使用的缓冲区队列以轮循的方式进行选择,如SE中a related question上的下图所示:

queing

这样,没有客户能获得优势,并且您(在您的上下文中)将公平的含义与实际的负载平衡脱钩了。

我还没有尝试过,但是我认为shovel plugin足以实现重新排队(图中的橙色)。如果您想进一步说明问题,例如配额决定什么是公平的,什么是不公平的,那么实施自己的重新排队服务可能是值得的。