2016-02-28 60 views
5

假设有多个生产者发布到同一个交换E(扇出)。每个制作人都有自己的频道。队列Q必须交换E.生产者P1将消息M1发布给E并从E接收确认A1。只有在确认A1后,第二个生产者P2发布第二个消息M2。 Q:M1中的RabbitMQ保证消息顺序是第一位,M2是第二位?那是否会订阅Q消费者总是收到M1,然后是M2?确认第一条消息后发送第二条消息。 RabbitMQ保证订单吗?

+0

为什么你有多个生产者时,生产者(P2)总是等待先前的生产者(P1)得到ack? P1和P2如何交流? – cantSleepNow

回答

1

RabbitMQ保证队列中消息的顺序:先进先出。进入队列的第一条消息将成为队列中的第一条消息,并且它们将保持顺序(假设你只是在消费和确认它们......如果你开始拒绝/拒绝消息,重新发布消息等等,事情会改变)

这是唯一的保证,它将在消息的顺序:FIFO队列。

如果您需要保证消息传递到队列的顺序,您必须自己构建该过程。

FWIW,这是很难建立这种保证。确保消息顺序的唯一真正有保证的方法是在第一个消息处理完成之前不发送下一个消息。

即使您在发送下一个之前等待发布者确认,下一个可能会在第一个之前排队(尽管极不可能)。

如果您需要保证客户端以特定顺序获取消息,您可能需要查看Message SequenceResequencer

+0

谢谢。我明白你的回答是“不”。我们都同意“进入**队列的第一条消息将成为队列中的第一条消息”。但我的问题是**交换和队列**之间的距离。如果我理解正确,你说交换可以确认获得消息M1给P1,接收消息M2,并以相反的顺序将它们放入队列中:M2,然后M1。正确? – Kaponir

+0

这很可能不会发生,但仍然有可能。例如,M1可能非常大,需要写入磁盘,而M2非常小,不需要写入磁盘。或者,正在使用M1的erlang进程可能会崩溃并且必须重新启动,从而使M2首先到达那里。再次,不可能的情景,但可能的,仍然。 –

+0

最终,如果您需要处理的保证顺序,您可以使用顺控程序并将队列的处理一次限制为1条消息,以便您可以正确地重新排列消息,如果它们出现故障 –