7

我有一个生产者,我想通过一致的哈希在消费者之间一致地分配工作。例如,对于消费者节点 X 和 Y,任务 A、B、C 应该总是去消费者 X,而 D、E、F 应该去消费者 Y。但是如果 Z 加入消费者池,这可能会发生一点变化。

我不想编写自己的逻辑来连接到消费者节点,尤其是不想管理加入和离开池的节点,所以我走上了使用 RabbitMQ 的道路,每个消费者节点都有一个独占队列.

我遇到的一个问题是列出这些队列,因为生产者需要在分配工作之前知道所有可用的队列。AMQP 甚至不支持列表队列,这让我不确定我的整个方法。不过,RabbitMQ 和 Alice(目前不完整)添加了该功能:是否有用于在 RabbitMQ 上列出队列和交换的 API?

这是对兔子的明智使用吗?我应该使用消息队列吗?是否有更好的设计让队列可以始终如一地在消费者之间分配我的工作,而不是我需要这样做?

4

2 回答 2

6

您所描述的在 RabbitMQ 中是可行的。

您的设置将类似于:

  • 生产者将消息发布到主题交换;让我们将其命名为consistent_divider;
  • 当消费者加入池时,它会连接到代理并使用其名称创建一个独占队列,但不会将其绑定到任何东西
  • 生产者定期轮询代理(可能使用rabbitmqctl list_consumers)以检查消费者是否已更改;如果有,它会删除所有现有绑定并根据需要重新绑定队列;
  • 当生产者发布时,消息被分配一个与其任务类型相匹配的路由键。

因此,如果您有 6 种任务类型:A、B、C、D、E、F,并且只有两个消费者 C1 和 C2,您的绑定将如下所示: C1 使用路由键 A、B 和 C 绑定 3 次到一致_divider;C2 使用路由键 D、E 和 F 绑定到 c_d 3 次。

当 C3 加入池时,生产者看到这一点并相应地重新绑定队列。

当生产者发布时,它会发送带有 routing_keys A、B、C、D、E 和/或 F 的消息,并且消息将被路由到正确的队列。

这将有两个潜在的问题:

  1. 消费者加入池和消息被路由到池之间有一点延迟;此外,如果队列中已经有消息,则消费者可能会获取用于另一个消费者的消息(例如,C3 加入,生产者重新绑定,但 C2 仍然会收到一些 E 和 F 消息,因为它们已经在其队列中),
  2. 如果消费者因任何原因死亡,其队列中的消息(以及前往其队列的途中)将丢失;这可以通过分别重新发布和死信消息来解决。

要回答您的最后一个问题,您可能想要使用队列,而 RabbitMQ 是一个不错的选择,但是您的要求(更准确地说是“一致地划分工作”位)并不完全适合 AMQP。

于 2010-09-03T11:39:28.827 回答
0

您可以使用rabbitmq的官方一致哈希插件,如回答here

于 2018-08-08T01:35:49.477 回答