IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 分布式事务解决方案选型建议 -> 正文阅读

[Java知识库]分布式事务解决方案选型建议

分布式事务解决方案对比分析

1.一致性,吞吐量,复杂度对比

2PC3PCTCC可靠消息最大努力通知SAGA
一致性强一致强一致最终一致最终一致最终一致
吞吐量
实现复杂度容易容易

2.分布式事务大致归类

  • 基于2PC实现的分布式事务。
  • 基于事务消息的分布式事务。
  • 基于TCC实现的分布式事务(业务层2PC)。
  • 基于SAGA实现的分布式事务。
  • 基于补偿实现的分布式事务,如seata的AT。
  • 基于最大努力通知的事务。

3.分布式解决方案适用理解

1.XA(2PC)

XA方案太依赖数据库了,性能没法得到保证,而且都要求强一致了,把这重任交给分布式事务,是不是不太合适,可以改造业务成单机事务,耗时虽然可能多些,但是效益是永久的,单机事务效率得到保证,同时还能得到重构经验和踩坑经验,之后设计就可以更敏感的规避分布式事务。

适用场景

  • 如果业务并发度真的不高,事务又需要支持回滚,数据库也能支持XA协议,又不想开发太多代码,那么这时候就选XA方案吧。
  • 适用于执行时间确定的短事务,在高并发的性能至上场景中,XA不适合。

2.可靠消息最终一致性方案

同步转异步,服务还解耦,性能有保证

适用场景

  • 适用于分布式事务的提交或回滚只取决于事务发起方的业务需求,其他数据源的数据变更跟随发起方进行的业务场景。
  • 对于实时性要求不高,主业务逻辑无需外部数据变更协助来完成的最终一致性事务。
  • 适合执行周期长,实时性要求不高,同时业务上不需要回滚的场景。
  • 适用于异步业务处理场景。

3.基于补偿实现的分布式事务(AT)

事务的提交,不单单只依赖事务发起者,还得由其他服务一起保证时,比如订单扣款服务,订单服务下了订单,然后调用扣款服务,此时扣款服务得保证用户账户是有钱的,这笔交易才算成功完成,就不适用于消息事务方案了,毕竟不论是先扣钱再发送消息去创建订单,还是先创建订单再发送消息去扣钱,前者网络出问题,会导致用户钱扣了,订单缺迟迟查不到,后者很可能订单都创建了,然后发现钱不够,消息事务一般都是通过重试保证数据一致,基本不提供回滚操作,此时数据不一致的情况就产生了。

适用场景

  • 事务消息方案满足不了,又要求编码少的场景。
  • 事务的成功由多个服务一起保证,同时每个服务都需要补偿机制的场景。
  • 允许数据有脏读的场景,比如发现订单创建了,然后因为钱不够又被取消了的情况。
  • 并发量不高的场景。

4.TCC

如果以上AT方案满足不了,比如说不允许用户看到订单还未完成,账户钱就被扣了的场景,实时性、一致性要求比较高,简单的理解就是不允许出现数据脏读的情况。
可以把TCC理解成是业务层2PC方案,适用场景广,但是大部分情况可以先不考虑,因为代码开发量可能很多,无形中引入新方案反而增加了开发成本,不过如果和钱有关的,还是可以考虑引入的,得保证在资金上不会出现问题。

适用场景

  • 实时性、一致性要求高,需要根据其他服务结果来决定业务走向。
  • 不允许出现脏读的情况,数据一致性要求高。
  • 业务需要实现用户无感知的回滚场景。
  • 资金交易类业务。

5.基于SAGA实现的分布式事务

可以把SAGA可以看做一个异步的、利用队列实现的补偿事务,该方案缺少隔离性,会出现中间状态,简单的可以理解为脏读。

适用场景

  • 事务链路较长,耗时较久,可以允许用户看到中间状态,便于观察每个子事务的执行情况。
  • 需要补偿机制
  • 不需要返回事务发起方执行结果的场景,要么一路重试走到成功,要么一路回退回归初始状态。
  • 事务的参与者有第三方公司的系统,无法进行改造和提供TCC 要求的接口,就可以考虑引入Saga模式,此时只要第三方系统接口返回执行失败,事务链路往回的补偿操作都是本系统能够提供的。
  • 只需要保证最终一致性的场景。

6.最大努力通知型事务(非可靠消息+定期校对)

最大努力通知方案不把结果成功的压力全部依赖给发起通知方,发起通知方会尽最大的努力将业务处理结果通知给接收通知方,但是不保证消息一定会被接收通知方收到,此时需要接收通知方主动来主动查询业务处理结果,尽最大可能保证一致性。

适用场景

  • 业务对最终一致性时间敏感度低,同时接收通知方的处理结果不影响发起通知方的场景。
  • 充值类业务,短信类业务。

4.分布式解决方案选型建议

  • 如果业务场景要求强一致性,那么最好尽量避免分散业务在不同服务中,尽量采用本地事务,尽量避免使用强一致性事务解决方案。
  • 选型参考优先级:单机事务 》消息事务方案 》AT 》TCC 》SAGA
  • 有些业务情况为了更好的性能可以采用混合事务方案,比如订单,账户,积分,订单的提交成功依赖账户,但是不依赖于积分,所以订单和账户可以用TCC补偿事务,订单和积分可以用消息事务方案。
  • 如果业务要求强一致,同时又是分布式部署情况,那么就采用TCC方案,别采用2PC方案,性能太低了,无法保证后续是否还要改造,不如一开始就把时间花的在刀刃上。
    ?
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-12-23 15:37:37  更:2021-12-23 15:39:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:01:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码