均匀分配Rabbitmq消息

时间:2019-02-05 20:21:20

标签: rabbitmq

目前,我们有一定数量的发布者(微服务)发布其消息以进行交换。每个消息都有一个serviceId属性。队列连接到处理队列消息的单个订户(微服务),处理单个消息是一项昂贵的操作(大约需要20到30秒)。 当前,我们处于以下情况:服务A发布约200条消息,几秒钟后服务B发布2条消息。因此,只有在处理前200条消息后,订阅者才会处理这2条消息。

我们要按照到达队列的顺序处理消息,但要针对源serviceId。

一种明显的解决方案是将队列划分为一个单独的队列(每个发布者一个)并分别订阅每个队列,但是发布者的数量可以更改,我们需要动态地请求它们并订阅(取消订阅)。

另一种方法是复制我们的订户应用,以在发布者和订户之间建立一对一的关系,但这将需要更多的系统资源。

处理这种情况的最佳方法是什么? 谢谢!

1 个答案:

答案 0 :(得分:0)

/!\注意,发布者发布到交换而不是队列。

  

我们要按照消息进入队列的顺序进行处理,   但关于源serviceId。

据我所知,您想根据serviceId对消息进行负载平衡,而serviceIds事先未知。

我在这里建议的解决方案是使用诸如xxxxx.<serviceId>之类的路由密钥进行直接交换。然后,您可以按serviceId绑定一个队列(即:一个队列用于服务A,一个队列用于服务B,...),每个使用者在所有队列上消耗。

然后,您必须处理发布者订阅:我将使发布者发布“ hello”消息,该消息由每个使用者使用,然后依次为该服务绑定新队列(使用xxxxx.<newServiceId>) ,最后发布回响应(以便发布者可以开始发送消息)。

注意:所有使用者的每个服务队列都是相同的,从而导致工作器配置(请参见this tutorial

希望这会有所帮助。