RabbitMQ:使用一致散列交换扩展队列

RabbitMQ:使用一致散列交换扩展队列,rabbitmq,rabbitmq-exchange,Rabbitmq,Rabbitmq Exchange,(从a接车) 我们使用RabbitMQ,这对于将密钥从一个exchange分片路由到多个队列非常有用 我们利用队列向工人分发工作。理想情况下,我们希望动态扩展这些工作人员,但这会带来一些问题 要扩大规模,您需要添加一个新队列和绑定。就其本身而言,这并不是一个大问题——除了切分密钥现在可能开始进入另一个队列这一事实 因此,工作者A可能一直在管理Thing1,但现在随着我们添加新的队列,工作者B可能最终获得Thing1的消息。工人A在工人B开始获取东西1消息之前完成所有的东西1处理,这一点很重要 他

(从a接车)

我们使用RabbitMQ,这对于将密钥从一个exchange分片路由到多个队列非常有用

我们利用队列向工人分发工作。理想情况下,我们希望动态扩展这些工作人员,但这会带来一些问题

要扩大规模,您需要添加一个新队列和绑定。就其本身而言,这并不是一个大问题——除了切分密钥现在可能开始进入另一个队列这一事实

因此,工作者A可能一直在管理Thing1,但现在随着我们添加新的队列,工作者B可能最终获得Thing1的消息。工人A在工人B开始获取东西1消息之前完成所有的东西1处理,这一点很重要


他们有什么方法或插件可以缓解这个问题吗?

在这种情况下,我会使用一个工作者来分派消息,而不是散列交换

生产者1。。。producern=>topic exchange=>queue=>dispatcher worker=>queue1。。。queuen=>worker1。。。工场


这样,调度员工作人员就可以跟踪所有消息。为此,您可以简单地检查队列中剩余的消息数量,或者检查工作进程确认消息,或者使用rabbitmqs RPC功能。

我的第一个问题是,为什么不能对同一队列使用多个工作进程?只有在必须确保一定的顺序时,才能将一个工人限制在一个队列中。我确实读了很多遍。消息顺序对您很重要。因此,在添加新工作进程之前,需要检查所有队列是否都是emtpy。该插件声明在添加新队列时存在竞争条件。在更罕见的情况下,您可能会得到重复的消息。我不会在这种特殊情况下使用这个插件。我将创建一个输入队列,其中一个调度程序工作人员侦听,此进程负责将所有Mesage分发到右侧消息队列。@slowjack2k工作人员在内存中管理状态,因此一个工作人员只能管理Thing1的状态。在这种情况下,我建议您使用调度程序工作人员而不是哈希交换。调度员更灵活。在为下一个请求使用新队列之前,它可以跟踪哪些消息已处理完毕,哪些未处理。我认为消息复制的风险对你的应用程序有很多影响。所以我在一个单独的worker中有效地实现了分布式散列交换(加上一些功能)?在这种特殊情况下是的。这需要更多的工作,但可以为您提供所需的细粒度控制。我能想到的另一件事是一种控制器工作者,你可以“询问”作为rpc实现,如果它在当前从实际工作者内部处理msg是有效的。我没有问的是,也许你可以在生产者内部等待,直到处理完来自这个生产者的最后一条消息。然后你只需要改变你的制作人。我可以改变我喜欢的任何东西,只是想知道最好的方法是什么,并希望一些rabbitmq插件能解决我所有的问题:)。是的,我可以添加一个同步步骤,但这最终会减慢系统的速度。实际上,我希望哈希交换具有发送路由密钥的位置的内存。IMO此解决方案不是最佳解决方案的原因至少有两个:1)具有单个调度程序使用者和单个队列,无法在多个队列之间共享负载。2) 为了有效地实现这一点,您需要调度员和工作人员之间进行某种特殊的通信。调度员如何知道哪些工作人员和队列正在等待消息?调度器如何知道消费者是否意外停止?这一切都由交换优雅地解决,而在dispatcher中,您将不得不支付相当多的复杂性和开销