【发布时间】:2016-12-16 19:31:07
【问题描述】:
(从Github Issue接听)
我们使用 RabbitMQ 的 consistent hash exchange,这对于将路由密钥从交换分片到多个队列很有用。
我们使用队列将工作分配给工人。理想情况下,我们希望动态扩展这些工人,但这会带来问题。
要扩大规模,您需要添加一个新队列和绑定。就其本身而言,这并不是什么大问题 - 除了分片键现在可能开始进入不同队列的事实。
所以 Worker A 可能一直在管理 Thing1,但现在当我们添加新队列时,Worker B 可能最终会收到 Thing1 的消息。在 Worker B 开始接收 Thing1 消息之前,Worker A 必须完成所有 Thing1 处理,这一点很重要。
他们有什么方法或插件可以缓解这个问题吗?
【问题讨论】:
-
我的第一个问题是为什么不能为同一个队列使用多个工作人员?只有当你必须确保一定的顺序时,你才必须将一个工人限制在一个队列中。
-
我确实需要多次阅读。消息顺序对您很重要。因此,您需要在添加新工作人员之前检查所有队列是否为空。该插件声明当您添加新队列时存在竞争条件。在极少数情况下,您最终可能会收到重复的消息。在这种特殊情况下,我不会使用此插件添加所有内容。我将创建一个输入队列,其中一个调度员工作人员侦听,该进程负责将所有消息分发到正确的 msg 队列。
-
@slowjack2k 工作人员正在管理内存中的状态,因此一个工作人员只能管理 Thing1 的状态。
-
在这种情况下,我建议您使用调度员工作人员而不是哈希交换。调度员更灵活。它可以在为下一个请求使用新队列之前跟踪哪些消息已处理,哪些未处理。我认为消息重复的风险会对您的应用产生很多影响。
标签: rabbitmq rabbitmq-exchange