Choreography Saga中Compensatable Transaction遇系统Bug的补偿处理问询
Choreography Saga 中系统Bug的补偿处理方案
核心原则先明确
Saga的补偿机制是为业务预期内的失败场景设计的,本质是保证分布式事务的最终一致性;而空指针、OOM这类系统级Bug属于非预期的技术故障,两者的处理逻辑要彻底分开。
不同故障场景的处理方式
- 业务规则不满足的失败:比如余额不足、库存超卖、参数不符合业务规范等,属于流程内可预见的失败,必须触发
*FailedEvent启动补偿动作链,这是Saga模式的核心价值。 - 系统级Bug引发的故障:空指针、内存溢出、数据库连接耗尽这类问题,绝对不能触发自动补偿:
- 这类故障会导致当前事务的执行状态完全不可控(比如不知道某一步到底有没有执行成功),自动补偿极可能引发重复执行、数据错乱等二次问题;
- 这类问题本质是代码或配置缺陷,必须通过修复Bug、重启服务、恢复数据等手动运维流程解决,业务补偿逻辑对此无能为力。
全局异常处理器的优化方向
不需要在全局异常处理器里加通用错误事件来触发补偿,反而要做异常分类处理:
- 只对自定义业务异常(比如
BusinessRuleFailedException)发布对应的*FailedEvent,触发补偿; - 捕获到系统异常时,重点做故障留存和告警:记录完整错误栈、事务上下文、请求参数,同时触发运维告警(邮件、监控平台推送),但不要发布任何补偿相关事件;
- 可额外发布
SystemErrorEvent专门用于运维监控,但这个事件和Saga补偿完全无关,仅用于故障通知。
实践补充建议
- 代码层面严格区分业务异常和系统异常,避免模糊边界;
- 给每个Saga事务添加状态标记(比如
PROCESSING/SUCCESS/BUSINESS_FAILED/SYSTEM_FAILED),方便运维快速定位故障类型; - 预留手动干预入口,当系统异常导致Saga中断时,等Bug修复后,可通过后台人工操作完成事务的重试或回滚。
内容的提问来源于stack exchange,提问作者jorgebo10
相关产品推荐
相关产品推荐

