Spring AMQP Rabbit - 单个消费者监听多个队列 - 交付顺序是什么?

Spring AMQP Rabbit - single consumer listening to multiple queues - what is the delivery order?

首先让我确定我解释了问题:

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

q1: m1, m2, m5, m7

q2: m3, m6, m9

q3: m4, m8

我想处理它们,使 m4 不在 m1、m2 或 m3 之前处理。 m3 可以随时执行(它不必等待 m1 和 m2,但它等待也是可以的,因为它很可能是 simpler/safer 来执行)。在处理完 m7 之前,m8 不会处理。

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

我们只是 运行 研究了 q3 在 q1 和 q2 中的记录之前处理的问题,所以它实际上不能做它应该做的事情。 q1 和 q2 确实需要更长的时间来处理,我们也希望将更多的记录放入这些队列中。

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

现在这是我的实际问题: 我已经看到您可以为多个队列设置 1 个侦听器 - 是否有任何关于我接收消息的顺序的文档?它只是一个循环,总是从每个队列中取出最旧的记录吗?还是它始终是它所收听的所有队列中最旧的记录传送给我的收听者?

这取决于prefetch,默认情况下,prefetch为1,这意味着broker将传递1条消息并等待ack。预取应用于通道(跨所有队列)。

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

I have requested that the sender change to a single queue,

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

如果生产者 "owns" 交换并且不会更改它,您可以将扇出交换绑定到他的交换并将您的单个队列绑定到它。

当然,如果他在他的交换器中添加队列,消息就会堆积在那里。

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