问题描述
我想问一问,当微服务之间的消息被拒绝时,保持可靠性的可能性有哪些?从今天开始,我们不想丢失消息,因此我们正在重新排队这些被拒绝的消息。因此,存在以不同于预期的顺序处理消息的风险。作为一个简单的示例,让我们采用两个微服务A和B的简单架构。A依次发布两个消息:
{"productStatus": "PUSBLISHED","productId": 1}
{"productStatus": "SOLD","productId": 1}
微服务B拒绝第一条消息,但接受第二条消息。由于我们要重新排队所有被拒绝的消息,因此我们将再次处理具有发布的生产者状态的消息,因此微服务B拥有关于产品1状态的错误信息。
想到的一个简单解决方案是在每个消息中添加objectVersionNumber
,以便消费者可以知道他已经处理了该对象的最新版本:
{"productStatus": "PUSBLISHED","productId": 1,"objectVersionNumber": 1}
{"productStatus": "SOLD","objectVersionNumber": 2}
解决方法
将prefetch
设置为1将保留消息顺序(以性能为代价)。