【问题标题】:What if rollback fails in SAGA transaction如果 SAGA 事务中的回滚失败怎么办
【发布时间】:2021-11-06 03:30:11
【问题描述】:

让我们想象一下这种情况,然后我们在微服务中分布式事务,由 SAGA approach 管理。存在调用服务 A、服务 B、服务 C 的 Out 事务。

失败的场景:

  • 服务A成功完成任务并发送消息给B 服务
  • 服务B成功完成任务并发送消息给C 服务
  • 服务 C 失败并向服务 B 发送消息以撤消 交易。
  • 服务 B 尝试撤消事务但失败。

因此,我们的数据不一致,这是不可接受的。 问题是,SAGA模式下事务回滚失败的情况如何处理?

【问题讨论】:

  • 需要重试直到成功。
  • 如果不一致是不可接受的,包括在等待saga回滚重试期间,您可以通过杀死服务A和B来消除不一致,直到可以纠正不一致(Consistency over Availability )。

标签: microservices saga


【解决方案1】:
  • 服务 B 立即重试但失败
  • 服务 B 在几秒钟后重试,但失败
  • 服务 B 在几分钟后重试,但失败
  • 消息被移动到“死信队列”,因为它没有被服务 B 标记为已处理
  • 工程师修复了服务 B 上的错误
  • 工程师从“死信队列”重新发送消息
  • 服务 B 成功处理消息

阅读有关此主题的更多信息https://codeopinion.com/handling-failures-in-message-driven-architecture/

【讨论】:

    猜你喜欢
    • 2011-04-26
    • 1970-01-01
    • 2019-02-10
    • 2011-06-14
    • 2012-08-01
    • 1970-01-01
    • 2010-12-31
    • 2016-01-11
    • 1970-01-01
    相关资源
    最近更新 更多