每日一博 | 一种基于柔性事务的分布式事务解决方案设计探究
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 回滚失败处理方案:
- 事务服务的高可用保障:柔性事务前提是保证事务服务高可用性,重点保障;
- 回滚服务重试机制:回滚接口失败重试机制,保证数据一致性;
- 为了避免架构复杂度,做日志记录、报警、人工处理。
4 注意问题
- 回滚服务的幂等性:回滚做好业务防重和系统防重,防止因为回滚带来的业务数据不一致;
- 脏数据:整个事务中某一方法执行失败,前面调用方法的数据作为脏数据使用。简单的解决方案:依赖事务表整个事务执行状态来决定能否使用脏数据。但缺点就是这样会耦合业务逻辑;
- 中心化:整个事务的维护完全依赖事务服务完成,需要保证事务服务的高可用性;
- 实时性:事务维护本方案通过定时任务维护,如果业务场景有实时性要求,方式可以改为:在整个事务中某一方法执行失败时,catch异常,catch内更新任务状态成功时,直接进行回滚逻辑调用。
5 总结
除了通过常规本地大事务保证事务完整性方案,本次方案提供了一套基于柔性事务回滚补偿的方式来保证分布式事务,通过维护事务服务和事务服务中心对应数据表,从而保障整个分布式事务的完整性。实现方式简单、轻量、易于操作,方便地解决了常见分布式事务场景。
作者:郑朋辉

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Symfony v6.1.7 发布,经典 PHP Web 开发框架
Symfony v6.1.7 发布了!Symfony 是一款基于 MVC 架构的PHP框架,致力于减少重复代码的编写,以加速 Web 应用的开发和维护。Symfony 与许多关系型数据库集成的也非常好,成本也较小。 此外,Symfony 致力于在企业背景下创建健壮的应用,同时也给予了开发者强大的配置功能:从文件结构到外部目录,几乎所有的东西都可以自定义。Symfony 也捆绑了一些诸如测试、调试、文档生成等额外的工具来满足企业的开发过程。 Symfony v6.1.7 更新内容如下: bug #47990 [HttpClient] 修复策略使用内容时重试请求 bug #47907 [控制台] 更新 Application.php bug #47955 [Security][Serializer] 将缺少的参数添加到 trigger_deprecation bug #47932 尝试生成注销时,抛出 LogicException 而不是错误 bug #47918 [国际] 将 ICU 数据更新为 72.1 - 5.4 bug #47857 [HttpKernel] 修复异常终止时的空请求...
- 下一篇
BitSail —— 高性能数据集成引擎
BitSail 是字节跳动开源的基于分布式架构的高性能数据集成引擎,支持多种异构数据源间的数据同步,并提供离线、实时、全量、增量场景下的全域数据集成解决方案,目前服务于字节内部几乎所有业务线,包括抖音、今日头条等,每天同步数百万亿数据。 BitSail目前已被广泛使用,并支持数百万亿的大流量场景。同时在火山引擎云原生环境、客户私有云环境等多种场景下得到验证。 开发团队积累了很多经验,并做了多项优化,以完善数据集成的功能 全域数据集成解决方案, 覆盖离线、实时、增量场景 分布式以及云原生架构, 支持水平扩展 在准确性、稳定性、性能上,成熟度更好 丰富的基础功能,例如类型转换、脏数据处理、流控、数据湖集成、自动并发度推断等 完善的任务运行状态监控,例如流量、QPS、脏数据、延迟等 BitSail使用场景 异构数据源海量数据同步 流批一体数据处理能力 湖仓一体数据处理能力 高性能、高可靠的数据同步 分布式、云原生架构数据集成引擎 BitSail主要特点 简单易用,灵活配置 流批一体、湖仓一体架构,一套框架覆盖几乎所有数据同步场景 高性能、海量数据处理能力 DDL自动同步 类型系统,不同数据源...
相关文章
文章评论
共有0条评论来说两句吧...