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

京东云开发者
• 阅读 159

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 总结

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


作者:郑朋辉

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
1年前
PHP 微服务之【分布式事务】
分布式事务一直是微服务的一个难点。相关的解决方案和框架大部分是java的,那么php该如何解决呢?下面一步一步讲解如何用php解决分布式事务。单机单数据源事务首先从单机事务开始。大概逻辑如下:try{//开始事务$dbbeginTransaction();
Wesley13 Wesley13
1年前
JPA多数据源分布式事务处理
前言多数据源的事务处理是个老生常谈的话题,跨两个数据源的事务管理也算是分布式事务的范畴,在同一个JVM里处理多数据源的事务,比较经典的处理方案是JTA(基于XA协议建模的java标准事务抽象)XA(XA事务协议),常见的JTA实现框架有Atomikos、Bitronix、Narayana,Spring对这些框架都有组件封装,基本可以做到开箱即用程
Stella981 Stella981
1年前
Bag分布式事务:对SAGA分布式事务的改进
最近打算给jSqlBox添加分布式事务功能,研究了几种分布式事务方案,对SAGA模式比较感兴趣,它是通过将多个事务隔离成多个单个事务,顺序执行(或回滚阶段倒序对冲)来完成的,但是SAGA分布式事务不能保证隔离性的问题,因为单纯的SAGA模式没有锁住资源。经考虑发现在SAGA的思路上,利用事务嵌套和全局锁,可以实现一种简单的分布式事务实现,暂时给它起个新名字叫
Stella981 Stella981
1年前
Dubbo学习系列之八(分布式事务之MQ方案)
自从小王玩起了微服务,发现微服务果然很强大,好处真是太多,心中暗喜,然而,却也遇到了分布式中最棘手的问题:分布式事务。小王遍访各路神仙,也无个完美开源解决方案,当然,也有些实际可行的手法,虽不算完美,但也可拿来研究一番,那今天我们也来说说分布式事务。    分布式事务的起源,即因各服务是独立的,各自使用独立的DB,那本地事务可以保证事务式执行,但其他服务
Wesley13 Wesley13
1年前
Java架构师之解决分布式事务数据一致性视频教程开发与实践分布式事务实现
Java架构师之解决分布式事务数据一致性视频教程开发与实践分布式事务实现全新JAVA高级架构师,微服务架构,亿级高并发,分布式架构,源码剖析系列,项目实战,设计模式实战,数据结构与算法,消息中间件,并发编程多线程,服务器系列,数据库,分布式事务,大型分布式综合电商项目实战等视频教程
Stella981 Stella981
1年前
ShardingSphere x Seata,一致性更强的分布式数据库中间件
日前,分布式数据库中间件 ShardingSphere 将Seata分布式事务能力进行整合,旨在打造一致性更强的分布式数据库中间件。背景数据库领域,分布式事务的实现主要包含:两阶段的XA和BASE柔性事务。XA事务底层,依赖于具体的数据库厂商对XA两阶段提交协议的支持。通常,XA协议通过在Prepare和Co
Stella981 Stella981
1年前
Seata是什么?一文了解其实现原理
一、背景随着业务发展,单体系统逐渐无法满足业务的需求,分布式架构逐渐成为大型互联网平台首选。伴随而来的问题是,本地事务方案已经无法满足,分布式事务相关规范和框架应运而生。在这种情况下,大型厂商根据分布式事务实现规范,实现了不同的分布式框架,以简化业务开发者处理分布式事务相关工作,让开发者专注于核心业务开发。Seata就是这么一个分布式事
Stella981 Stella981
1年前
25 张图,1.4 w字!彻底搞懂分布式事务原理
!(https://oscimg.oschina.net/oscnet/0c08fb0b18a1456caf7fee690e02de5e.jpg)本文提纲如下:0\.前言1\.单数据源事务&多数据源事务2\.常见分布式事务解决方案2.1.分布式事务模型
Wesley13 Wesley13
1年前
MySQL查询缓存
1、mysql分布式事务在mysql中,使用分布式事务的应用程序涉及一个或多个资源管理器和一个事务管理器,分布式事务的事务参与者、资源管理器、事务管理器等位于不同的节点上。这些不同的节点相互协作共同完成一个具有逻辑完整性的事务。分布式事务主要作用在与确保事务的一致性和完整性。1.1、了解分布式事务的原理  资源管理器(RM):用于向事务提供资
京东云开发者 京东云开发者
1个月前
基于Seata探寻分布式事务的实现方案
随着业务的快速发展、业务复杂度越来越高,几乎每个公司的系统都会从单体走向分布式,特别是转向微服务架构。随之而来就必然遇到分布式事务这个难题,这篇文章通过seata框架总结了分布式事务的几种解决方案。