Spring AMQP Rabbit - 单个用户收听多个队列 - 交付顺序是什么?

时间:2016-04-29 14:38:50

标签: java rabbitmq spring-amqp spring-rabbit spring-rabbitmq

首先我要确保解释问题

我必须按照实际创建的顺序处理多个已填充的队列。这意味着如果队列包含:

q1:m1,m2,m5,m7

q2:m3,m6,m9

q3:m4,m8

我想处理它们,以便m4不会在m1,m2或m3之前处理。 m3可以随时执行(它不必等待m1和m2,但它可以等待,因为它很可能更简单/更安全地实现)。在m7处理之前,m8不会处理。

我知道它会序列化工作 - 但是使用多个线程,并且我已经锁定了有效负载中的其他一些值,这有助于确保它们不会相互踩踏并获得一定数量的并行处理。

我们刚刚遇到问题q3在q1和q2中的记录之前处理过,所以它实际上并没有做它应该做的事情。 q1和q2确实需要更长的时间来处理,我们希望在这些队列中也有更多的记录。

我已请求发件人更改为单个队列,但我不确定他们是否会进行此更改(不同的团队,不同的优先级),因此我正在尝试制定切合实际的备份计划。

现在这是我的实际问题: 我已经看到你可以拥有一个多个队列的监听器 - 是否有关于接收消息的顺序的文档?它只是一个循环,总是从每个队列中取出最早的记录吗?或者它始终是它收听的所有队列中最早的记录,并传递给我的听众?

1 个答案:

答案 0 :(得分:3)

它取决于预取,默认情况下,预取是1,这意味着代理将传递1条消息并等待确认。预取适用于通道(跨所有队列)。

如果容器concurrentConsumers是1(默认值),它们将按顺序处理,但顺序是不确定的 - 这取决于代理如何传递它们。当单个通道在多个队列中有消费者时,我不知道rabbitmq使用的内部算法;最好假设它是不确定的。

  

我已请求发件人更改为单个队列

生产者使用路由密钥发布到交换机 - 他不应该关心下游的队列拓扑。消费者通过绑定到该交换来决定队列拓扑 - 如果您将交换更改为扇出,您可以将单个队列绑定到它,并且无论生产者使用哪个路由密钥,您都将按顺序获取消息。

如果制作人“拥有”交易所并且不会更改它,您可以将扇出交换绑定到他的交易所并将您的单个队列绑定到该交换。

当然,如果他在他的交流中添加队列,那么消息就会在那里积累。

但是,正如我所说,生产者不需要参与队列拓扑。