生产者通过消息队列一致地对消费者进行散列?

Blu*_*luu 7 producer-consumer amqp rabbitmq consistent-hashing

我有一个生产者,我想通过一致的散列在消费者中一致地分配工作.例如,对于消费者节点X和Y,任务A,B,C应始终转到消费者X,而D,E,F应转到消费者Y.但如果Z加入消费者池,则可能会转移一点.

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

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

这是一个明智的使用兔子?我应该使用消息队列吗?有没有更好的设计,所以队列可以在消费者之间不断分配我的工作,而不是我需要这样做?

scv*_*lex 6

你所描述的是RabbitMQ中可以做到的.

您的设置将是这样的:

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

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

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

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

这有两个潜在的问题:

  1. 当消费者加入游戏池并将消息路由到游戏池之间时,存在轻微的延迟; 另外,如果队列中已经存在消息,则消费者可能获得针对另一个消费者的消息(例如,C3连接,生产者重新绑定,但C2仍然会获得一些E和F消息,因为它们已经在其队列中),
  2. 如果消费者因任何原因而死亡,其队列中的消息(以及到其队列的路由)将丢失; 这可以通过分别重新发布和死字母来解决.

要回答你的上一个问题,你可能想要使用排队,而RabbitMQ是一个很好的选择,但是你的要求(更确切地说是"一致地划分工作")并不完全适合AMQP.