【问题标题】:RabbitMQ messages reliability for at-least-once deliveryRabbitMQ 消息至少一次交付的可靠性
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 2017-10-02
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多