忘川彼岸|我只是下了个订单,鬼知道我在微服务里经历了什么?( 六 )
完美 , 使用 MQ 分布式事务就可以解决调一致性问题 。
等等 , MQ 消息事务方案的风险了解一下 。
上面使用 MQ 的方式确实是可以完成 A 和 B 操作 , 但是 A 和 B 并不是严格一致性 , 而是最终一致性 。
我们牺牲掉严格一致性 , 换来性能的提升 , 这种很适合在大促高并发场景使用 。
但是如果 B 一直执行不成功 , 那么一致性也会被破坏 , 后续应该考虑到更多的兜底方案 , 方案越细系统就将越复杂 。
TCC 方案
TCC 是服务化的二阶段变成模型 , 每个业务服务都必须实现 Try , Confirm , Calcel 三个方法 。
这三个方式可以对应到 SQL 事务中 Lock , Commit , Rollback:
- Try 阶段:Try 只是一个初步的操作 , 进行初步的确认 , 它的主要职责是完成所有业务的检查 , 预留业务资源 。
- Confirm 阶段:Confirm 是在 Try 阶段检查执行完毕后 , 继续执行的确认操作 , 必须满足幂等性操作 , 如果 Confirm 中执行失败 , 会有事务协调器触发不断的执行 , 直到满足为止 。
- Cancel:是取消执行 , 在 Try 没通过并释放掉 Try 阶段预留的资源 , 也必须满足幂等性 , 跟 Confirm 一样有可能被不断执行 。
在 Try 的时候 , 会让库存服务预留 n 个库存给这个订单使用 , 让订单服务产生一个“未确认”订单 , 同时产生这两个预留的资源 。
在 Confirm 的时候 , 会使用在 Try 预留的资源 , 在 TCC 事务机制中认为 , 如果在 Try 阶段能正常预留的资源 , 那么在 Confirm 一定能完整的提交:
在 Try 的时候 , 有任务一方为执行失败 , 则会执行 Cancel 的接口操作 , 将在 Try 阶段预留的资源进行释放 。
完美 , 可以把我们的系统引入 TCC 。 ^?_?^
等等 , 有同学提问:
- 有同学可能会问了 , 如果在 Confirm 或 Cancel 中 , 有一方的操作失败了 , 可能出现异常等情况该怎么解决 。
这个也就是我们强调 , Confirm , Cancel 接口必须是幂等性的一个原因了 。
- 还有同学会问了 , 为什么事务协调器知道 Confirm , 或 Cancel 没有完成 。
- 还有同学会问 , 事务怎么传递 , 这个就涉及使用的 TCC 的框架了 , 一般来说用的都是隐式传参的方式 。
这里推荐 TCC 的开源框架使用 mengyun 的 TCC , 然后也可以其他的 , 无所谓 。
推荐阅读
- |申花希望租借格德斯遭鲁能拒绝,马丁内斯尚未加盟只是试训
- 忘川彼岸|启迪设计中标微软(中国)苏州科技园区二期办公楼项目设计总包
- 徐婷|4年前,徐婷在北京全身溃烂而亡,其实背后不只是患癌这么简单
- UZI|Uzi玩游戏输给邹市明?二人只是小打小闹,真打还得看寒夜毒纪
- 卡玛拉|《复仇者联盟》:不只是游戏,更是一部优秀的电影
- 伽德鲁|《没落要塞》如果一切只是一场游戏,那么活着是否还有意义?末日中的假象看似命运的安排其实是一场游戏活着是否还有意义
- 海克尔|人类起源上最大的骗局,存在百多年,我们在娘胎里只是条鱼?
- 澎湃新闻|签协议时不知要搬驻以使馆?塞尔维亚总统:只是再检查一遍
- 美国有线电视新闻网|《大西洋月刊》总编辑:有关特朗普骂阵亡美军的报道,只是“冰山一角”
- 环球网|大西洋月刊总编辑:特朗普骂阵亡美军的报道,只是“冰山一角”