【发布时间】:2020-10-19 15:13:46
【问题描述】:
我想问在微服务之间交换消息时,当其中一条消息被拒绝时,保持可靠性的可能性是什么。截至今天,我们不想丢失消息,因此我们正在重新排队这些被拒绝的消息。因此,消息的处理顺序可能与预期不同。举个简单的例子,我们以两个微服务 A 和 B 的简单架构为例,A 依次发布两条消息:
{"productStatus": "PUSBLISHED", "productId": 1}
{"productStatus": "SOLD", "productId": 1}
微服务 B 拒绝第一条消息,但接受第二条消息。由于我们正在重新排队所有被拒绝的消息,我们正在再次处理具有 PUBLISHED 生产者状态的消息,因此微服务 B 关于产品 1 状态的信息不正确。
想到的一个简单解决方案是在每条消息中添加objectVersionNumber,这样消费者就可以知道他已经处理了最新版本的对象:
{"productStatus": "PUSBLISHED", "productId": 1, "objectVersionNumber": 1}
{"productStatus": "SOLD", "productId": 1, "objectVersionNumber": 2}
还有其他方法可以解决这个问题吗?也许消息的语义应该完全改变?
【问题讨论】:
-
您可能需要探索优先队列选项以及预取限制
-
我没有看到 objectVersionNumber 方法有什么问题...如果数字小于当前丢弃,则表示已过时
-
我真的不明白这个场景 - 你为什么要拒绝和重新排队消息?更重要的是,我不确定这个问题是否适合本网站的格式 - 您有解决方案,并想与某人讨论,但这不是讨论论坛。
标签: spring-boot rabbitmq microservices spring-amqp spring-rabbit