【问题标题】:Sending second message after acknowledge of first one. Does RabbitMQ guarantee the order?在确认第一个消息后发送第二个消息。 RabbitMQ 是否保证订单?
【发布时间】:2016-02-28 18:13:45
【问题描述】:

假设多个生产者发布到同一个交易所 E(扇出)。每个生产者都有自己的频道。队列 Q 必然要交换 E。生产者 P1 向 E 发布消息 M1,并从 E 接收到确认 A1。只有在确认 A1 之后,第二个生产者 P2 才发布第二个消息 M2。 RabbitMQ是否保证Q中的消息顺序:M1在前,M2在后?那就是订阅 Q 的消费者总是会收到 M1,然后是 M2?

【问题讨论】:

  • 当一个生产者(P2)总是在等待前一个生产者(P1)得到确认时,为什么会有多个生产者? P1 和 P2 如何通信?

标签: rabbitmq


【解决方案1】:

RabbitMQ 保证队列中消息的顺序:先进先出。进入队列的第一条消息将是从队列中出来的第一条消息,它们将保持有序(假设您只是在消费和确认它们......如果您开始接收/拒绝消息,重新发布它们等,事情发生了变化)

这是它对消息顺序做出的唯一保证:FIFO 队列。

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

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

即使您在发送下一个之前等待发布者确认,下一个也有可能在第一个之前进入队列(尽管可能性很小)。

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

【讨论】:

  • 谢谢。我理解你的回答是“不”。我们都同意“进入队列的第一条消息将是第一条从队列中出来的消息”。但我的问题是关于交换和队列之间的距离。如果我理解正确,您说交换可以向 P1 确认消息 M1 的获取,接收消息 M2 并将它们以相反的顺序放入队列:M2,然后是 M1。对吗?
  • 这种情况发生的可能性很小,但仍有可能。例如,M1 可能非常大,需要写入磁盘,而 M2 非常小,不需要写入磁盘。或者,在 M1 上工作的 erlang 进程可能会崩溃并必须重新启动,从而允许 M2 先到达那里。同样,不太可能发生的情况,但仍有可能。
  • 最后,如果您需要保证处理顺序,您可以使用定序器并将队列的处理限制为一次处理 1 条消息,以便在消息无序时正确地重新排序消息
  • 我参考了stackoverflow.com/questions/53596761/…的这个答案。我不确定这是否正确,因为 RabbitMQ 提供了一些基本的顺序保证,这里似乎忽略了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-07
  • 1970-01-01
  • 1970-01-01
  • 2022-11-09
  • 1970-01-01
  • 2015-08-23
  • 2020-05-13
相关资源
最近更新 更多