补偿操作
事务补偿(回滚) 逆向补偿
重试(立即重试 固定间隔重试 增量重试 指数重试) 正向补偿
- 下游系统返回「请求超时」、「被限流中」等临时状态的时候,我们可以考虑重试
- 而如果是返回“余额不足”、“无权限”等明确无法继续的业务性错误的时候就不需要重试了
- 一些中间件或者 rpc 框架中返回 Http503、404 等没有何时恢复的预期的时候,也不需要重试
重试需要注意幂等性
saga
Saga由事件驱动、无锁、高性能、高吞吐,易于理解,易于实现,事务参与者之间异步执行,是一种针对长业务流程长事务的解决方案。
Saga中每个事务的参与者在收到正向操作请求时,会立即提交事务。如果发生异常,由事务协调者发出回滚请求,处理者执行回滚操作。
Saga不像传统2PC/ACID事务,任何一个事务参与者失败,立即同步执行回滚操作,Saga所有操作都是异步执行。
Saga如何实现ACID
原子性
在Saga中事务任何一个步骤失败,都调用回滚接口实现撤销。
一致性/完整性
服务内部的本地事务由数据库保证,跨服务的数据完整性由应用完成。
持久性
由数据库保证
隔离性
Saga模式决定不能保隔离性,可通过引入事件溯源实现隔离性,但并不一定适用所有场景,在Saga整个事务没有结束期间,操作都以事件的方式记录下来,当需要查询数据时,通过回放事件,对数据进行动态计算。
在猫眼的票务系统交易,就是用的saga分布式事务模式
下单 支付 出票 都是一个事务,都是异步执行
如何保证原子性的,每个事务失败,都会调用事务补偿(逆向流程回滚)
如何保证持久性和一致性的,通过数据库保证,每个事务都是个任务
https://infoq.cn/article/0lMOVdP-kqWvbAa5QiEo
https://cs.xieyonghui.com/architecture/saga-pattern_151.html