消息在队列中排序

时间:2015-04-09 18:11:01

标签: rabbitmq message-queue distributed-computing

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

enter image description here

方案

  1. 制作人创建消息A(1),由最高消费者接收,消费者开始处理消息。
  2. 制作人创建消息A(2),由底层消费者接收(假设两个消费者都在循环交换中)。
  3. 底层消费者发布消息B(2),该消息被放入消息B消费者队列
  4. 可怜的慢速消费者终于完成并发出消息B(1)。
  5. 问题

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

    我曾考虑使用应用于消息A的初始发布的时间戳,并让消费者维护最后一次更改的时间戳,在此之前拒绝任何时间戳,但这只有在每条消息导致完全相同时才有效一种变化,需要大量的跟踪。

    如何理解这一点的其他想法将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:2)

我不确定RabbitMQ的具体内容,但如果你有一个单个制作人,那么带时间戳的想法听起来是一个好的开始。

生产者将时间戳附加到消息A,每个消息B采用其相应消息A的相同时间戳。

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

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

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

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

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