服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

柔性事务的分布式事务解决方案设计探究

日期: 来源:SpringForAll收集编辑:
关注我,回复关键字“spring”
免费领取Spring学习资料

来源 | OSCHINA 社区

作者 | 京东云开发者-郑朋辉

原文链接:https://my.oschina.net/u/4090830/blog/5585963

1 背景

市面上常见的有,2pc/3pc、tcc、saga 等常见的分布式事务解决方案,但是实际实施起来框架比较重,设计开发比较繁琐,不易于快速开发上手。本文提供一种基于柔性事务设计的简单易上手的分布式事务设计方案,用于解决常见的分布式事务常见场景。

2 常见分布式事务场景

2.1 同步场景

常见的场景,方法内依赖外部微服务多个同步接口,等同步接口返回再展开后续逻辑,如下图 1 描述。

图 1 分布式事务同步场景
存在的问题:B/C 失败后,A/B 不能回滚,造成数据不一致?

2.2 异步场景

方法内依赖外部微服务多个同步接口同时,本地事务提交并发出异步 MQ,如下图 2 描述。

图 2 分布式事务异步场景
存在的问题:询价系统无法保证本地事务和 mq 消息的发送同时成功或失败,会造成数据不一致。

3 解决方案

3.1 数据模型设计

事务表:记录每次同步方法执行的状态,包括:1 - 进行中(同步方法执行开始)、2 - 已完成(同步方法执行成功)、3 - 失败(同步方法执行失败)、4 - 已回滚(回滚方法执行成功);
方法调用表:记录一个完整的事务内所有方法的执行前入参、同步方法接口、回滚接口、回滚入参、方法执行顺序,如下图 3 描述:

图 3 事务服务数据模型

3.2 设计原理

原理:一个完整事务内,1. 首先每个方法提供回滚接口,其次,事务内每次同步方法执行时,优先维护入参数据到事务表,方便后续做回滚补偿;2. 整个事务内某一个方法执行失败时,结束整个事务,并更新事务表状态 = 失败;3. 事务表通过轮询状态 status=3 (失败) 事务,调用回滚接口,利用回滚入参进行接口补偿;4. 回滚逻辑:找到事务表中失败的执行方法的顺序值,只调用小于失败顺序值的所有回滚接口、入参,注意并不回滚失败值的接口,并根据顺序倒序进行接口回滚补偿。

图 4 回滚原理图

3.3 执行时序


图 5 回滚执行时序图

3.4 回滚失败处理方案:

  1. 事务服务的高可用保障:柔性事务前提是保证事务服务高可用性,重点保障;

  2. 回滚服务重试机制:回滚接口失败重试机制,保证数据一致性;

  3. 为了避免架构复杂度,做日志记录、报警、人工处理。

4 注意问题

  1. 回滚服务的幂等性:回滚做好业务防重和系统防重,防止因为回滚带来的业务数据不一致;

  2. 脏数据:整个事务中某一方法执行失败,前面调用方法的数据作为脏数据使用。简单的解决方案:依赖事务表整个事务执行状态来决定能否使用脏数据。但缺点就是这样会耦合业务逻辑;

  3. 中心化:整个事务的维护完全依赖事务服务完成,需要保证事务服务的高可用性;

  4. 实时性:事务维护本方案通过定时任务维护,如果业务场景有实时性要求,方式可以改为:在整个事务中某一方法执行失败时,catch 异常,catch 内更新任务状态成功时,直接进行回滚逻辑调用。

5 总结

除了通过常规本地大事务保证事务完整性方案,本次方案提供了一套基于柔性事务回滚补偿的方式来保证分布式事务,通过维护事务服务和事务服务中心对应数据表,从而保障整个分布式事务的完整性。实现方式简单、轻量、易于操作,方便地解决了常见分布式事务场景。


END



SSO 单点登录和 OAuth2.0 的区别和理解
使用 Jenkins 持续集成的一些经验总结
Spring Boot 项目如何按模块进行拆分?
云原生时代的 Java 虚拟机

关注后端面试那些事,回复【2022面经】

获取最新大厂Java面经


最后重要提示:高质量的技术交流群,限时免费开放,今年抱团最重要。想进群的,关注SpringForAll社区,回复关键词:加群,拉你进群。

点击这里领取2022大厂面经


相关阅读

  • 7min 到 40s:SpringBoot 启动优化实践!

  • 关注我,回复关键字“spring”,免费领取Spring学习资料。来源:https://juejin.cn/post/71813425237285929550 背景公司 SpringBoot 项目在日常开发过程中发现服务启动过程异常缓
  • Spring Boot中一个注解优雅实现重试

  • 关注我,回复关键字“spring”,免费领取Spring学习资料。重试,在项目需求中是非常常见的,例如遇到网络波动等,要求某个接口或者是方法可以最多/最少调用几次;实现重试机制,非得用Ret
  • Spring Boot 项目鉴权的 4 种方式

  • 关注我,回复关键字“spring”,免费领取Spring学习资料。文章介绍了spring-boot中实现通用auth的四种方式,包括 传统AOP、拦截器、参数解析器和过滤器,并提供了对应的实例代码,最
  • “兵心 兵情”演出慰问退役军人

  • “过去你们戎马一生,为国家经济建设和国防事业作出了重要贡献,是党和国家的宝贵财富,如今你们离开部队,相聚海淀,希望你们把海淀作为第二故乡,热爱海淀、关心海淀、建设海淀……”
  • 审计费5000万!中国石油续聘会计师事务所!

  • 版权声明会计雅苑-会计审计资讯平台。本文来自公司公告,由会计雅苑收集整理,如需转载请注明来源。中国石油天然气股份有限公司(以下简称公司)拟继续聘用普华永
    道中天会计师事
  • 走进加油站 为安全意识“加油”

  • 为进一步加强加油站消防宣传教育培训工作,打击冒牌消防培训违法行为,全力提升加油站员工的消防安全防范意识和应急处置能力,坚决预防和遏制各类火灾事故的发生,4月24日,高新
  • 娄底:退役军人安置工作帮扶解困见真情

  • “我的养老保险金和职业年金终于要回来了,感谢娄底市退役军人事务局用心用情保障我们这些退役老兵的合法权益。”近日,退役军人肖某紧握市退役军人事务局工作人员的手,满含热泪
  • 东莞多措并举推进涉外法律服务业发展

  • 近年来,东莞市司法局积极贯彻落实国家、省、市有关加强涉外法律服务人才队伍建设的决策部署,着力打造一支政治立场坚定、涉外服务能力强、执业纪律严明的高素质专业化的涉外法

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四
  • 美国对华2000亿关税清单,到底影响有多大?

  • 1 今天A股大跌,上证最大跌幅超过2%。直接导火索是美国证实计划对华2000亿美元产品加征25%关税。 听起来,2000亿美元数目巨大,我们来算笔账。 2000亿美元,按现在人民币汇率

最新文章

  • 7min 到 40s:SpringBoot 启动优化实践!

  • 关注我,回复关键字“spring”,免费领取Spring学习资料。来源:https://juejin.cn/post/71813425237285929550 背景公司 SpringBoot 项目在日常开发过程中发现服务启动过程异常缓
  • 柔性事务的分布式事务解决方案设计探究

  • 关注我,回复关键字“spring”,免费领取Spring学习资料。来源 | OSCHINA 社区作者 | 京东云开发者-郑朋辉原文链接:https://my.oschina.net/u/4090830/blog/55859631 背景市面上
  • 用漫画讲解 Java,太秀了!

  • Java语言在企业级开发中的地位一直很稳固,几十年下来,Java语言不管在开发者数量还是企业级应用部署量都是领先的。每年有大量的新人立志学好Java,但是又因为Java体系过于庞大,让
  • Spring Boot中一个注解优雅实现重试

  • 关注我,回复关键字“spring”,免费领取Spring学习资料。重试,在项目需求中是非常常见的,例如遇到网络波动等,要求某个接口或者是方法可以最多/最少调用几次;实现重试机制,非得用Ret
  • Spring Boot 项目鉴权的 4 种方式

  • 关注我,回复关键字“spring”,免费领取Spring学习资料。文章介绍了spring-boot中实现通用auth的四种方式,包括 传统AOP、拦截器、参数解析器和过滤器,并提供了对应的实例代码,最
  • 从新React文档看未来Web的开发趋势

  • 作者 | Luke Twomey 译者 | 核子可乐 策划 | 丁晓昀 新的 React 文档终于到来,目前已经通过全新 React.dev 域与广大开发者见面。长久以来,官方文档是一直是新手们学习