具有基于消费者的负载平衡的消息队列

sit*_*ein 5 load-balancing message-queue

阅读常见消息队列系统(例如 RabbitMQ、ActiveMQ)的文档,似乎负载平衡总是由队列系统(循环)或由生产者使用消息上的多个队列或属性来完成。然而,在我们的应用程序中,没有人(甚至消费者)知道处理消息需要多长时间。它可以在几毫秒到几小时之间(它基本上是在任意输入 x 上计算任意函数 f)。因此,负载平衡应该由消费者执行,因为它们仅在其“负载”低于阈值时才接受消息(负载可以是正在执行的作业的数量、CPU 负载等)。理想情况下,生产者将一条消息放入队列中,该消息被“提供”给所有消费者,但只有一个消费者接受并处理该消息。甚至可能发生第一轮没有消费者接受它的情况,它一直留在队列中,直到有一个消费者有空闲资源。所以可能的问题是:对于任何常见的消息队列系统来说,这是否可能以某种方式实现,或者我们是否找错了方向?

Chr*_*ald 4

由于这些系统的性质,这是可以实现的,无需任何实际的额外工作。在 RabbitMQ 中,您可以设置预取大小,它指定提前获取的作业数量。您可以将其设置为 0,以便每个消费者一次只能有一份工作。您希望将其与消息确认结合使用,以便消费者必须先确认一条消息,然后才能提供另一条消息。

所有空闲的消费者都会排队等待作业,MQ 会按照 FIFO 顺序将作业分配给它们。一旦他们完成了作业的处理,就会确认该作业,并且 MQ 会为他们提供队列中的下一个作业。如果没有消费者处于空闲状态并准备好执行作业,则该消息将保留在队列中,直到有消费者可用为止。