Spring boot RabbitMQ消息至少一次传递的可靠性

Spring boot RabbitMQ消息至少一次传递的可靠性,spring-boot,rabbitmq,microservices,spring-amqp,spring-rabbit,Spring Boot,Rabbitmq,Microservices,Spring Amqp,Spring Rabbit,我想问,在微服务之间交换消息时,当其中一条消息被拒绝时,保持可靠性的可能性是什么。从今天起,我们不想丢失消息,因此我们正在将这些被拒绝的消息重新排队。因此,存在以与预期不同的顺序处理消息的风险。作为一个简单的例子,让我们使用两个微服务A和B的简单结构:一个接一个地发布两个消息: {"productStatus": "PUSBLISHED", "productId": 1} {"productStatus": &quo

我想问,在微服务之间交换消息时,当其中一条消息被拒绝时,保持可靠性的可能性是什么。从今天起,我们不想丢失消息,因此我们正在将这些被拒绝的消息重新排队。因此,存在以与预期不同的顺序处理消息的风险。作为一个简单的例子,让我们使用两个微服务A和B的简单结构:一个接一个地发布两个消息:

{"productStatus": "PUSBLISHED", "productId": 1}
{"productStatus": "SOLD", "productId": 1}
Microservice B拒绝第一条消息,但接受第二条消息。由于我们正在对所有被拒绝的消息重新排队,因此我们再次处理具有已发布生产者状态的消息,因此microservice B具有关于产品1状态的错误信息。 想到的一个简单解决方案是在每条消息中添加
objectVersionNumber
,这样消费者就可以知道他已经处理了对象的最新版本:

{"productStatus": "PUSBLISHED", "productId": 1, "objectVersionNumber": 1}
{"productStatus": "SOLD", "productId": 1, "objectVersionNumber": 2}

有没有其他方法来解决这个问题?也许消息的语义应该完全改变?

预取设置为1将保留消息顺序(以牺牲性能为代价).

您可能必须探索优先级队列选项以及预取限制。我看不出objectVersionNumber方法有任何错误…如果该数字小于当前丢弃,则表示已过期。我不太理解这种情况-为什么您首先拒绝并重新查询消息?更重要的是,我不确定这个问题是否适合这个网站的格式-你有一个解决方案,并想与某人讨论,但这不是一个讨论论坛。