我在RabbitMQ设置中有一个场景,我很好奇如何解决 . 下图说明了它(为了简洁而删除了交换和大多数队列):
Scenario
-
生产环境 者创建消息A(1),它由顶级消费者接收,它开始处理消息 .
-
生产环境 者创建消息A(2),它由底层消费者接收(假设两个消费者都在循环交换中) .
-
底部消费者发布消息B(2),该消息被放入消息B消费者的队列中
-
可怜的慢速消费者终于完成并发出消息B(1) .
Problem
如果我们假设不能使B消费者成为幂等的,那么我们如何确保两个B消息的结果以正确的顺序应用?
我曾想过使用应用于消息A的初始发布的时间戳,并让消费者维护最后一次更改的时间戳,在此之前拒绝任何时间戳,但这只有在每条消息导致完全相同的更改时才有效并需要大量的跟踪 .
关于如何处理这个的其他想法将不胜感激 . 谢谢!
1 回答
我不确定RabbitMQ的具体内容,但如果你有一个 生产环境 者,那么带时间戳的想法听起来是一个好的开始 .
生产环境 者将时间戳附加到消息A,每个消息B采用其相应消息A的相同时间戳 .
使用您的方法,将不会处理某些消息,例如消息B(1) . 如果所有消息都应该由消费者B处理,但是应该以确定的顺序处理它们,那么您可以进行确定性合并:
消费者B配备了两个队列,每个消费者一个队列A.消费者B总是检查两个队列的顶部:
如果两个队列都非空,则消费者B弹出具有最低时间戳的消息 .
如果至少有一个队列为空,则消费者B等待 .
使用这种方法,消费者B处理消息的顺序由 生产环境 者的时间戳给出,并且不丢弃任何消息 . 假设是:
队列是FIFO
没有进程崩溃
始终是每个消费者A最终处理消息的情况
使用者B可以以非阻塞方式检查队列的顶部