我有一个生产者,我希望通过一致的散列在消费者中一致地分配工作。例如,对于消费者节点X和Y,任务A,B,C应始终转到消费者X,D,E,F应转到消费者Y.但如果Z加入消费者池,这可能会转移一点。
我不想处理编写自己的逻辑来连接到消费者节点,特别是不管理节点加入和离开池,所以我走上了使用RabbitMQ和独占队列的道路每个消费者节点。
我遇到的一个问题是列出这些队列,因为生产者需要在分配工作之前知道所有可用的队列。 AMQP甚至不支持列表队列,这使我不确定我的整个方法。 RabbitMQ和Alice(brokenly at the moment)添加了该功能:Is there an API for listing queues and exchanges on RabbitMQ?
这是明智的使用兔子吗?我应该使用消息队列吗?是否有更好的设计,因此队列可以始终将我的工作分配给消费者,而不是我需要这样做?
答案 0 :(得分:6)
您所描述的内容可以在RabbitMQ中使用。
您的设置将类似于:
因此,如果你有6种任务类型:A,B,C,D,E,F,只有两个消费者C1和C2,你的绑定看起来像:C1绑定3次到使用路由键A,B的consistent_divider和C; C2使用路由密钥D,E和F绑定3次到c_d。
当C3加入池时,生产者会看到这一点并相应地重新绑定队列。
当生产者发布时,它会发送带有routing_keys A,B,C,D,E和/或F的消息,消息将被路由到正确的队列。
这有两个潜在的问题:
要回答你的上一个问题,你可能想要使用排队,而RabbitMQ是一个很好的选择,但是你的要求(更确切地说是“一致地划分工作”)并不完全适合AMQP。
答案 1 :(得分:0)
您可以将Rabbitmq的官方consistent-hashing插件用作已回答的here