分布式事务的华丽进化 | 京东物流技术团队
说到分布式事务,大家并不陌生。在实际工作中,用得比较多的还是柔性分布式事务,今天主要把在工作中运用到的几种柔性分布式事务的场景及实现方式做一个简单介绍,也可以看做是柔性分布式事务的一个演进过程。
一、调用方保证
这种方式适合业务内自己使用,当方法内的任务一个逻辑发生异常时,整个方法都异常,由调用方进行重试。该方法不太适合于外部系统的交互,否则,这就是把自己的命运交到别人的手里,是比较危险的做法。
在上述调用示意图中,内部应用APP1和APP2之间,APP1的方法method1调用APP2里的method2方法,method2里有分布式事务逻辑,当分布式事务中的逻辑异常后,method2方法都失败或抛出异常,method1收到返回值是失败或异常后,都需要重试调用method2,确保method2执行成功。method2本身则需要确保逻辑中已经成功的逻辑再次被调用时处理也要正确。
@DistributedTransaction method2(){ //write DB //send msg //RPC invoke }
该方法不建议大家在工作中使用,仅从保证分布式事务的正确性看是可以使用的,但从Java的规范上看,这种方法属于用异常控制流程,并不是很规范。同时,如果分布式事务中的逻辑是写本地库,发消息或RPC远程调用,则一般不建议把事务和发消息或RPC调用放到事务方法内,避免大事务。
二、定时任务扫描业务表
该场景主要运用于流量小、业务场景较单一的场景,或是业务处于验证阶段,为了快速验证业务是否有价值阶段,直接用业务表来做任务表,避免建多张表。在用本地事务写完业务表后,事务正常提交即可。通过一个定时任务查询业务表的增量数据,在定时任务中处理其他业务逻辑。
@Transaction void method1(){ //write DB1 Bueiness Table //other business Logic } void method2(){ //查询DB1中的Bueiness Table,时间从上次任务开始执行的时间开始 //处理自身的业务逻辑 }
该方案一般作为过渡方案,最终业务量上来后,会升级到下面的本地任务表的方案。
三、本地任务表
这是比较典型的分布式事务的解决方案,即:在业务库中,同步建一个任务表。业务表和任务表在本地事务中同时写入,再由一个定时任务定时查询任务表,把任务读取到后根据业务逻辑要求进行处理。
业务表和任务表在一个数据库中,由数据库的一个事务控制器实现事务。在应用中,另起一个定时任务,由定时任务去查询任务表,把任务表中新进的任务抓取后执行该定时任务需要执行的业务逻辑。
@Transaction void method1(){ //write DB1 Bueiness Table //write DB1 Task Table } void method2(){ //定时查询DB1中的Task Table //任务抓取后执行自身的业务逻辑 }
该方案实际运用时,定时任务的稳定性需要我们特别关注,定时任务的稳定性决定我们该方案的可用性。建议把定时任务的执行情况监控起来,确保有问题时能第一时间处理,避免影响业务。
四、组件抽取
目前,对于Java语言开发的团队,其框架大部分都以Spring为主,故可基于SpringEvent异步事件做一个小的组件封装。主要思路为在事务中,发送Event异步事件,当异步事件发送成功则事务提交结束,当异步事件发送失败则异步任务落本地数据库后事务再提交结束,然后通过定时任务从任务表中抓取任务执行。
该方案以SpringEvent异步事件为主做了一个组件,当SpringEvent异步事件发送异常后,降级到本地任务表,确保异步任务的可靠性。即使没有封装为组件,在实际工作中,还是比较推荐大家使用该方案。
@Transaction void method1(){ //业务数据写入DB成功 try{ //发送SpringEvent事件 }catch(Exception ex){ //写入本地任务表 } } void method2(){ //接收事件或定时任务的数据执行业务逻辑 }
当然,如果项目中没有使用Spring框架也没问题,有了上述的思想,可以根据自身使用的框架情况进行调整。正所谓“只要思想不滑坡,办法总比困难多”。
作者:京东物流 廖宗雄
来源:京东云开发者社区 自猿其说Tech 转载请注明出处

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
COSCLC 社区畅聊第八期: 1 周岁发布MVP版本,凹语言有话说!
凹语言是针对 WASM 平台设计的通用静态类型编译型语言。它是由国内的一群编程语言爱好者发起的项目,设计重点是降低使用者的心智负担。 从2018年底立项,2019年开始前期准备,2020年加入新成员,2021年项目联合发起人共同出版合著书籍《Go语言定制指南》,2022年项目正式启动并于7月20日开源,凹语言一步一个脚印,在国内的同类项目中,首个实现了浏览器内编译、执行全链路。 开源一周年之际,凹语言在8月12日发布了MVP版本,为发展提供了更多可畅享的未来,本期COSCLC 社区畅聊,我们邀请了凹语言项目的联合发起人和临时决策委员会的委员,为大家介绍凹语言项目及社区,讲述在发展过程中面对困难与压力,以及采取的应对措施,针对MVP版本也进行细致说明,和大家一同展望凹语言的发展。 直播主题:1 周岁发布MVP版本,凹语言有话说! 直播时间:8 月 24 日 19:00-20:30 直播平台:“OSC 开源社区”视频号 直播嘉宾: 项目联合发起人:柴树杉、丁尔男,合著有《WebAssembly标准入门》、《面向WebAssembly编程》、《Go语言定制指南》等专著 临时决策委员会委员:...
- 下一篇
专访|openEuler社区导师刘忻:积极拥抱开源
开源之夏专访持续进行中,欢迎各位同学与导师和我们一起分享参与开源之夏活动的宝贵经验和精彩故事,也欢迎社区向我们推荐优秀案例。 本期专访我们邀请到了openEuler社区导师、兰州大学副教授——刘忻老师,本届开源之夏刘老师指导的项目是基于secGear的高效机密计算数据结构设计与实现。 项目链接:https://summer-ospp.ac.cn/org/prodetail/23b970578 今年在刘忻老师的协助组织下,开源之夏顺利走进了兰州大学,与兰大学子展开了深入交流。 自我介绍 OSPP:请您做一个简单的自我介绍。 刘忻:大家好,我叫刘忻,目前为兰州大学信息科学与工程学院副教授,CCF-教育专业委员会执行委员、CCF-计算机安全专业委员会执行委员,是一名对于开源工作十分热爱的大学老师。 OSPP:您最早是如何接触到开源的?从高校老师的角度,您如何理解开源的概念与理念? 刘忻:最早接触开源工作还要感谢咱们华为的老师。记得是2021年1月在西安的一次培训班上,当时因为科研需要,问了华为老师很多问题,对方很热情地记录了我的问题,说是会联系专业对口的专家跟我联系。培训结束后,回到了兰州...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Windows10,CentOS7,CentOS8安装Nodejs环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS8编译安装MySQL8.0.19
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Docker使用Oracle官方镜像安装(12C,18C,19C)