RabbitMQ - 按优先级消费多个队列

7

我有一个升级我们生产者/消费者基础设施的需求。

当前设置如下:

  • 一组具有不同优先级(低、中、高)的队列。
  • 当我们的客户生成任务时(如处理图像):
    • 生产者将消息添加到相关队列中。
    • 其中一个工作进程对其进行处理。

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

建议的更改:

  • 每个客户(或一组客户)应该有专用的消费者(或一组消费者)。
  • 当消费者处于空闲状态时,它们应该处理其他客户的消息。

例如,我们有一组消息:

 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)是使用联邦队列并形成完整的双向图(每个队列都是所有其他队列的上游,反之亦然)。

1个回答

1

针对每种类型的工作负载,都没有能够生成公平队列的公式;任务处理的数量、均匀程度和持续时间非常重要。话虽如此,我怀疑联邦队列在公平性方面没有任何帮助。

您可以使用优先级队列消费者优先级。结合较低的预取计数,可能可以实现符合客户期望的调度。

但是,这些机制都不会基于客户使用的容量来限制客户;如果客户在短时间内发送了太多高优先级、处理速度缓慢的任务,仍然会阻止其他客户。

既然你提出每个客户只有一个消费者的可能性,我理解客户数量不是很大。可以考虑的解决方案是为每个客户设置优先级队列。所有这些队列的消息都可以被一个缓冲队列以轮询方式选择,并由多个工作器消费,如SE上一个相关问题中所解释的图表所示:

queing

这样,没有客户会占据优势,你也可以在一定程度上将公平(在你的情境中)与实际的负载均衡分离开来。
我自己没有尝试过,但我认为 铲子插件 可能足以实现重新排队(图表中的橙色部分)。如果您想要更详细的内容,比如配额决定什么是公平的和什么不是,那么实现自己的重新排队服务可能值得一试。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接