您好!
欢迎来到京东云开发者社区
登录
首页
博文
课程
大赛
工具
用户中心
开源
首页
博文
课程
大赛
工具
开源
更多
用户中心
开发者社区
>
博文
>
一种基于柔性事务的分布式事务解决方案设计探究
分享
打开微信扫码分享
点击前往QQ分享
点击前往微博分享
点击复制链接
一种基于柔性事务的分布式事务解决方案设计探究
自猿其说Tech
2022-09-20
IP归属:未知
17800浏览
计算机编程
### 1 背景 市面上常见的有,2pc/3pc、tcc、saga等常见的分布式事务解决方案,但是实际实施起来框架比较重,设计开发比较繁琐,不易于快速开发上手。本文提供一种基于柔性事务设计的简单易上手的分布式事务设计方案,用于解决常见的分布式事务常见场景。 ### 2 常见分布式事务场景 #### 2.1 同步场景 常见的场景,方法内依赖外部微服务多个同步接口,等同步接口返回再展开后续逻辑,如下图1描述。 <center>![](//img1.jcloudcs.com/developer.jdcloud.com/aee03724-b38e-45b2-8266-0d8d91c745a820220920142153.png) 图1 分布式事务同步场景</center> 存在的问题:B/C失败后,A/B不能回滚,造成数据不一致? #### 2.2 异步场景 方法内依赖外部微服务多个同步接口同时,本地事务提交并发出异步MQ,如下图2描述。 <center>![](//img1.jcloudcs.com/developer.jdcloud.com/cc5460da-b320-4f67-b0d2-dea1979a3ffa20220920144310.png) 图2 分布式事务异步场景</center> 存在的问题:询价系统无法保证本地事务和mq消息的发送同时成功或失败,会造成数据不一致。 ### 3 解决方案 #### 3.1 数据模型设计 事务表:记录每次同步方法执行的状态,包括:1-进行中(同步方法执行开始)、2-已完成(同步方法执行成功)、3-失败(同步方法执行失败)、4-已回滚(回滚方法执行成功); 方法调用表:记录一个完整的事务内所有方法的执行前入参、同步方法接口、回滚接口、回滚入参、方法执行顺序,如下图3描述: <center>![](//img1.jcloudcs.com/developer.jdcloud.com/d5e6bdd6-3677-40b0-8c24-0eb24d24d08220220920144346.png) 图3 事务服务数据模型</center> #### 3.2 设计原理 原理:一个完整事务内,1.首先每个方法提供回滚接口,其次,事务内每次同步方法执行时,优先维护入参数据到事务表,方便后续做回滚补偿;2.整个事务内某一个方法执行失败时,结束整个事务,并更新事务表状态=失败;3.事务表通过轮询状态status=3(失败)事务,调用回滚接口,利用回滚入参进行接口补偿;4.回滚逻辑:找到事务表中失败的执行方法的顺序值,只调用小于失败顺序值的所有回滚接口、入参,注意并不回滚失败值的接口,并根据顺序倒序进行接口回滚补偿。 <center>![](//img1.jcloudcs.com/developer.jdcloud.com/f5b7eb90-4d5b-4154-8e32-eb23c38f5d2e20220920144416.png) 图4 回滚原理图</center> #### 3.3 执行时序 <center>![](//img1.jcloudcs.com/developer.jdcloud.com/e7425c85-6f1e-473d-a8f0-45adfa04450020220920144441.png) 图5 回滚执行时序图</center> #### 3.4 回滚失败处理方案: 1. 事务服务的高可用保障:柔性事务前提是保证事务服务高可用性,重点保障; 2. 回滚服务重试机制:回滚接口失败重试机制,保证数据一致性; 3. 为了避免架构复杂度,做日志记录、报警、人工处理。 ### 4 注意问题 1. 回滚服务的幂等性:回滚做好业务防重和系统防重,防止因为回滚带来的业务数据不一致; 2. 脏数据:整个事务中某一方法执行失败,前面调用方法的数据作为脏数据使用。简单的解决方案:依赖事务表整个事务执行状态来决定能否使用脏数据。但缺点就是这样会耦合业务逻辑; 3. 中心化:整个事务的维护完全依赖事务服务完成,需要保证事务服务的高可用性; 4. 实时性:事务维护本方案通过定时任务维护,如果业务场景有实时性要求,方式可以改为:在整个事务中某一方法执行失败时,catch异常,catch内更新任务状态成功时,直接进行回滚逻辑调用。 ### 5 总结 除了通过常规本地大事务保证事务完整性方案,本次方案提供了一套基于柔性事务回滚补偿的方式来保证分布式事务,通过维护事务服务和事务服务中心对应数据表,从而保障整个分布式事务的完整性。实现方式简单、轻量、易于操作,方便地解决了常见分布式事务场景。 ------------ ###### 自猿其说Tech-JDL京东物流技术与数据智能部 ###### 作者:郑朋辉
原创文章,需联系作者,授权转载
上一篇:大数据平台项目解决方案
下一篇:论⽂解读:⼀种结合同态加密与秘密分享技术的纵向逻辑回归模型
相关文章
Taro小程序跨端开发入门实战
Flutter For Web实践
配运基础数据缓存瘦身实践
自猿其说Tech
文章数
426
阅读量
2149963
作者其他文章
01
深入JDK中的Optional
本文将从Optional所解决的问题开始,逐层解剖,由浅入深,文中会出现Optioanl方法之间的对比,实践,误用情况分析,优缺点等。与大家一起,对这项Java8中的新特性,进行理解和深入。
01
Taro小程序跨端开发入门实战
为了让小程序开发更简单,更高效,我们采用 Taro 作为首选框架,我们将使用 Taro 的实践经验整理了出来,主要内容围绕着什么是 Taro,为什么用 Taro,以及 Taro 如何使用(正确使用的姿势),还有 Taro 背后的一些设计思想来进行展开,让大家能够对 Taro 有个完整的认识。
01
Flutter For Web实践
Flutter For Web 已经发布一年多时间,它的发布意味着我们可以真正地使用一套代码、一套资源部署整个大前端系统(包括:iOS、Android、Web)。渠道研发组经过一段时间的探索,使用Flutter For Web技术开发了移动端可视化编程平台—Flutter乐高,在这里希望和大家分享下使用Flutter For Web实践过程和踩坑实践
01
配运基础数据缓存瘦身实践
在基础数据的常规能力当中,数据的存取是最基础也是最重要的能力,为了整体提高数据的读取能力,缓存技术在基础数据的场景中得到了广泛的使用,下面会重点展示一下配运组近期针对数据缓存做的瘦身实践。
自猿其说Tech
文章数
426
阅读量
2149963
作者其他文章
01
深入JDK中的Optional
01
Taro小程序跨端开发入门实战
01
Flutter For Web实践
01
配运基础数据缓存瘦身实践
添加企业微信
获取1V1专业服务
扫码关注
京东云开发者公众号