我在RabbitMQ设置中有一个场景,我很好奇如何解决。下图说明了它(为了简洁而删除了交换和大多数队列):
方案
问题
如果我们假设B消费者不能成为幂等的,那么我们如何确保两个B消息的结果以正确的顺序应用?
我曾考虑使用应用于消息A的初始发布的时间戳,并让消费者维护最后一次更改的时间戳,在此之前拒绝任何时间戳,但这只有在每条消息导致完全相同时才有效一种变化,需要大量的跟踪。
如何理解这一点的其他想法将不胜感激。谢谢!
答案 0 :(得分:2)
我不确定RabbitMQ的具体内容,但如果你有一个单个制作人,那么带时间戳的想法听起来是一个好的开始。
生产者将时间戳附加到消息A,每个消息B采用其相应消息A的相同时间戳。
使用您的方法,将不会处理某些消息,例如消息B(1)。如果消费者B应处理所有消息,但应以确定性顺序处理它们,那么您可以执行确定性合并:
消费者B配备了两个队列,每个消费者一个队列A.消费者B总是检查两个队列的顶部:
使用这种方法,消费者B处理消息的顺序由生产者的时间戳给出,并且不丢弃任何消息。假设是: