浅析分布式事务的底层实现模型
导读:本文介绍了分布式事务的基本概念,以及在实现时通常会涉及到的组件及核心逻辑,供大家参考。
在计算机系统中事务最早由 DBMS 引入并实现,数据库事务是数据库管理系统执行过程中的逻辑单位,由访问并更新各种数据项的多步骤的程序构成的执行单元,在使用时通过 begin 和 end transaction 语句或则函数调用作为事务界限。事务执行后要么全部执行完成要么整个事务回滚。数据库事务通常仅对单一数据库资源对象进行访问或者更新,也可以称为本地事务(Local Transaction),其完全遵循 ACID 规范。
但是当前分布式架构成为主流,系统对资源对象的访问通常会跨多个服务器或者多节点,本地事务无法满足分布式架构系统的要求。因此分布式事务应运而生,如下图所示,用户发起业务请求后会通过组件 A 和组件 B 进行两个操作,这两个组件部署在不同节点上。
分布式事务是相对于本地事务来说,是指事务的参与者、事务访问的资源管理器及事务管理器位于分布式系统的不同节点之上的事务。通过分布式事务实现业务请求的最终成功要解决的核心问题:
•如何管理分布式事务的提交及放弃,在上图中如果该业务请求中 A 操作执行成功,但是 B 操作的执行遇到错误,需要放弃整个业务请求,在一些场景下 A 可以提交本地事务
•如何保证并发事务在涉及到多个节点上资源对象访问的可串行性,由于业务请求通常是跨多个节点执行时间通常会很长,为了提高效率不可能让前置的操作执行后该节点处于资源加锁状态。并且两个事务在涉及到所有服务器上其他资源对象的冲突访问,都要保证事务的先后顺序。
为了解决以上问题 ,需要引入分布式原子提交协议的算法,如两阶段提交协议 ,对分布式事务执行过程中的提交或放弃决策进行管理,确保分布式事务提交的原子性。而第二个问题需要由分布式事务的并发控制机制来处理。
不仅仅是数据库,基本上起到中间件作用的分布式系统都提供了事务能力,例如消息队列、分布式协调服务、缓存等基础服务都会提供事务接口,这些分布式系统所处理的资源与数据库中的资源类型是不同的。而且在开源社区中分布式事务框架比较多,例如 Apache Seata、Axon Framework Saga、EasyTransaction、ServiceComb 等。可以将分布式事务进行抽象,以此来更好的理解分布式事务,如下图所示:
1)资源或者数据
事务的管理实体,数据库记录只是被管理资源的一种,在分布式事务中涉及到的资源可能会有很多种,例如调用的接口、Rpc 调用、文件等都可以作为事务的管理角色。
2)管理组件
分布式事务框架中需要管理的是事务的执行,包括全局事务及子事务,每个子事务都对应资源服务的调用,调用结果决定了子事务是否会成功。在 JTA(Java Transaction API)规范(JSR-907)中采用 DTP 模型,目前分布式系统中大部分的系统都使用或者借鉴这个模型,主要包括:
•事务管理器(TM): 所有事务的管理,包括事务的声明、事务资源管理及上下文传播等,其他的事务参与者都与 TM 进行交互;
•资源管理器(RM): 理论上是存储数据的软件,例如关系型数据库、消息中间件等;
•应用程序,通过事务 SDK 或者其他方式声明及启动分布式事务。在应用程序或者客户端中通常会内置分布式事务客户端(Transaction Client),客户端进行事务的发起和结束。
在很多的系统中管理组件可能会使用其他的名称,例如消息队列 Pulsar 事务中没有 RM 的组件,但是 Broker 完成 TC 发送过来事务的命令,其起到了 RM 的作用。
3)事务协议
事务协议定义了事务的开启到结束的交互过程,例如在数据库中 XA 协议是常用的二阶段提交协议。在不同的事务模式下不同的系统会使用不同的事务协议,例如 TCC(三阶段提交协议),如下图所示:
其他常见的事务协议还有 TA、SAGA 等。
4)事务状态
在分布式事务中会有多个子事务,TM 要根据子事务的状态进行全局事务的管理,并且保证 TM 故障重启后可以继续未完成的事务。因此在分布式事务中事务状态的保存也是一个重要的组成部分,在 Apache Seata 中使用数据库来保持,在 Axon Framework Saga 中使用消息队列来记录子状态的执行状态。
分布式事务的实现涉及到很多内容,包括遵循的分布式系统理论,例如刚性事务(如单一数据库事务)遵循 ACID 规范,但是柔性事务基于 BASE 理论。在分布式事务在实现过程中如果保证一致性,如何在并发执行时不产生脏数据等。这里还要提到一点的是分布式事务在子事务执行过程中采用的资源管理机制,采用补偿机制还是类 WAL 机制,在补偿机制中子事务会先根据调用将结果持久化,当需要进行回滚时通过补偿机制将结果恢复原状。
本文仅大致介绍下分布式事务在实现时通常会涉及到的组件及核心逻辑,大家可以根据这个思路对某种分布式事务的框架进行解析,对于上面涉及到分布式事务的课题都有必要花费大量篇幅进行阐述。
评论