分布式事务
# 分布式事务
# 1、简介
分布式一致性是分布式系统需解决的关键问题之一,在微服务的实践中分布式事务是用户遇到的最大痛点。
Seata 在阿里经济体内部经过了漫长的孵化,承载了双 11 洪荒流量,实践证明 Seata 是一款解决分布式数据一致性的的优秀组件。
Seata 除了提供了独创的 AT 事务模式外,还扩展了 TCC、Saga 和 XA 事务模式,满足大家对于不同业务场景中的需求。
# 2、学习目标
- 理解分布式事务在业务中的核心使用场景和常用解决方案
- 理解 Seata AT 事务模式的核心原理
- 掌握 Seata 作为分布式事务组件与 Spring Cloud 的整合
- 如何扩展一个 RPC 框架
- Seata 实战
# 3、为什么需要分布式事务?
前言
分布式事务不是在新架构下产生的新问题,即使在单体应用中同样存在着分布式事务问题,典型的场景是单体应用执行方法中含有多个数据源。
X/OPEN 对于这一问题,提出了含有三种角色的 DTP(Distributed Transaction Processing)模型并形成了 XA 规范来解决此问题。
各厂商针对 XA 规范做了具体的实现,也就是大家常说的 XA 协议。在 Java 体系中基于 DTP 模型提出了 JTA 规范,定义了分布式事务中的【事务管理器(TM)】与【资源管理器(RM)】、【应用程序(AP)】等的 Java 接口。
在 Java EE 时代,应用服务器如 weblogic 充当了 TM 的角色,而传统关系数据库通过实现 XA 协议充当了 RM 的角色。
原因
微服务架构的引入使分布式数据一致性问题更为突出,由原来的单体应用拆分出来几十甚至上百个微服务。
- 如何保证服务间的一致性?
- 当在一条较长的微服务调用链中,位于中间位置的微服务节点出现异常,如何保证整个服务的数据一致性?
业务的本质体现在数据上,数据不一致的直接后果是可能产生资损,更严重的是如果不一致的数据不能被及时发现,业务再次基于此数据的进行相关逻辑操作,会进一步导致数据错上加错,最终很难溯源。
# 4、常见的分布式事务解决方案
从是否满足事务 ACID 特性上,我们可以将事务分为两大类:刚性事务和柔性事务。
在常见解决方案中:
- XA 事务属于刚性事务解决方案,
- 而其他的大多数解决方案如 TCC、 Saga、消息最终一致性则属于柔性事务解决方案。
# 消息最终一致性
消息最终一致性方案是在 Seata 问世之前,市面上应用最广泛的一种解决方案。
优点
它本身具有削峰填谷,可异步化的优点,更多的适应于可异步化的末端链路消息通知场景。
缺点
但是它本身也存在着一些缺点:
- 需要依赖可靠消息组件,消息的可靠性很重要,大多数的原生消息组件故障时很难降级;
- 实时性比较差,要经过多次网络 IO 开销和持久化,遇到队列积压情形实时性不可控;
- 无法保证隔离性,在已发送消息和消息消费之前,中间数据对外可见,无法满足事务 isolate 特性;
- 只能向前重试不可向后回滚,消息消费无法成功时无法回滚消息生产侧的数据;
- 无法保证多条消息间的数据一致性。
# XA
在工业界使用 XA 落地方案的相对较少,主要集中在应用服务器的场景。
XA 方案要求相关的厂商提供其具体协议的实现,目前大部分关系数据库支持了 XA 协议。
XA 方案被人诟病的是其性能,其实更为严重的是对于连接资源的占用,导致在高并发未有 足够的连接资源来响应请求成为系统的瓶颈。
# TCC
# Saga
# 总结
上面提到了 4 种常用的分布式事务解决方案,Seata 集成了 TCC、Saga 和 XA 方 案。另外,Seata 还提供了独创的 AT 强一致分布式事务解决方案。
# 5、AT 事务模式
一个分布式事务有全局唯一的 xid,由若干个分支事务构成,每个分支事务有全局唯一的 branchId。
# 6、Seata 与 Spring Cloud 集成
从代码上可以分为三大部分:rest、feign 和 web。AutoConfiguration 结尾的类是 @Configuration
类被 spring.factories
加载,负责创建 package 中所属的 bean
。
# 7、如何扩展一个 RPC 框架?
主要可以分为两大部分:
- 事务上下文传递
- 事务上下文绑定和清除
具体 API 参考官方文档:Seata api (opens new window)
# 8、实战样例
地址:seata/seata-samples: seata-samples (github.com) (opens new window)
# 参考书籍
重磅下载 | Java 开发者必备手册《Spring Cloud Alibaba 从入门到实战》,阿里双11同款!-阿里云开发者社区 (aliyun.com) (opens new window)