跨队列的消息排序

Message Ordering Across Queues

我的 RabbitMQ 设置中有一个场景,我很好奇如何解决。下图说明了这一点(为简洁起见删除了交换和大多数队列):

场景

  1. 生产者创建消息 A(1),它被顶级消费者接收,开始处理消息。
  2. 生产者创建消息 A(2),由底层消费者接收(假设两个消费者都在循环交换)。
  3. 底层消费者发布消息B(2),放入消息B消费者队列
  4. 可怜的慢顶消费者最终完成并发出其消息 B(1)。

问题

如果我们假设 B 消费者不能幂等,我们如何确保两个 B 消息的结果以正确的顺序应用?

我曾想过使用应用于消息 A 的初始发布的时间戳,并让消费者维护上次更改的时间戳,拒绝该时间之前的任何时间戳,但这仅在每条消息导致完全相同的更改,需要大量跟踪。

关于如何解决这个问题的其他想法将不胜感激。谢谢!

我不确定这里的 RabbitMQ 有什么特别之处,但是如果您有一个 单个 生产者,那么带有时间戳的想法听起来是个不错的开始。

生产者为消息A附加一个时间戳,每条消息B采用与各自消息A相同的时间戳。

使用您的方法将不会处理某些消息,例如消息 B(1)。如果所有消息都应由消费者 B 处理,但它们应该以 确定性顺序 处理,那么您可以执行 确定性合并 :

消费者B配备了两个队列,每个消费者A一个队列。消费者B总是检查两个队列的顶部:

  • 如果两个队列都非空,则消费者 B 弹出具有最低时间戳的消息。
  • 如果至少有一个队列为空,则消费者 B 等待。

使用这种方法,消费者 B 处理消息的顺序由生产者的时间戳给出,并且不会丢弃任何消息。假设是:

  • 队列是 FIFO
  • 没有进程崩溃
  • 总是这样,最终每个消费者 A 处理一条消息
  • 消费者 B 可以以非阻塞方式检查队列的顶部