RabbitMQ / AMQP:多个队列,单个消费者

时间:2018-05-02 17:44:34

标签: rabbitmq amqp node-amqp

我想创建一个处理来自多个可变数量源的消息,这些消息是动态连接或断开的。

我需要的是每个消费者优先考虑每个来源的前N条消息。然后运行多个消费者以提高速度。

我一直在阅读Work queuesRoutingTopics以及许多其他文档的文档,而没有确定如何实现这一点。我也毫无运气地做了一些测试。

有人能指出我该怎么做或在哪里阅读它?

- 编辑 -

QueueA ----- A3 - A2 - A1-┐

QueueB ----- B3 - B2 - B1-┼------消费者

QueueC ----- C3 - C2 - C1-┘

期望的效果是每个消费者获得每个队列的第一条消息。例如:A1,B1,C1,A2,B2,C2,A3,B3,C3等。如果创建了新队列(QueueD),则消费者将以相同的方式开始从其接收消息。

提前致谢

1 个答案:

答案 0 :(得分:0)

  

我需要的是每个消费者优先考虑每个来源的前N条消息。然后运行多个消费者以提高速度。

我所知道的所有消息队列仅在队列本身内提供排序保证(Kafka提供的排序保证不在队列级别,而是在队列内的分区内)。但是,在这里您要求序列化多个队列。这在分布式系统环境中是不可能的。

为什么?因为如果这些队列中有多个消费者,消息将以循环方式传递给队列中每个连接的消费者。

假设prefetch_count=1并且有两个连接的消费者,请说明第一组消息如下:

  • A1,B1& C1交付给消费者1(X)
  • A2,B2& C2交付给消费者2(Y)

现在,在分布式系统中,一切都是异步的,事情可能会出错。例如:

如果X确认A1,则A3将被交付给X.但如果Y在X之前获得A2,则A3将被交付给Y.

在分布式系统中,首先不在您的控制范围内。请考虑以下情况:

  • X可能不得不等待I / O或CPU绑定任务,而Y可能很幸运,它不必等待。然后Y将推进队列中的消息。
  • 或者Y被杀(分区)或者n / w变慢,然后X将继续消耗队列。

我强烈建议您重新考虑您的要求,并在异步环境中考虑您的预期保证(否则您不会考虑MoM,不是吗?)。

PS:可以通过一些消费者端逻辑来实现您的要求(性能/吞吐量会受到惩罚)。

  • 单个消费者必须连接到所有队列
  • 在确认消息之前等待来自每个队列的消息。
  • 收到来自每个队列的消息后,将它们分组为单个消息并发布到另一个队列(P)。
  • 现在许多消费者可以订阅P来处理有序的消息组。

我不建议,但嘿,这是你的系统,谁会阻止你;)