Seata:分布式事务解决方案

一、Seata 简介

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。它为用户提供了 at、tcc、saga 和 xa 等事务模式,旨在打造一站式的分布式解决方案。

二、Seata 的三大角色

  1. tc(transaction coordinator)-事务协调者:维护全局和分支事务的状态,驱动全局事务提交或回滚。
  2. tm(transaction manager)-事务管理器:定义全局事务的范围,负责开始全局事务、提交或回滚全局事务。向事务指定标识(xid),监视它们的进展,并处理事务的完成和失败。
  3. rm(resource manager)-资源管理器:管理分支事务所使用的资源,与 tc 交谈以注册分支事务并报告分支事务状态,接受 tc 的命令来提交或者回滚分支事务。

其中,tc 为单独部署的 server 服务端,tm 和 rm 为嵌入到应用中的 client 客户端。

三、AT 模式介绍

AT 模式是一种无侵入的分布式事务解决方案。

AT 模式实现说明

一阶段:

  1. Seata 会拦截“业务 sql”,解析 sql 语义。
  2. 查询“业务 sql”要更新的业务数据,在业务数据被更新前,将其保存成“before image”。
  3. 执行“业务 sql”,更新业务数据。
  4. 查询更新后的数据,将其保存成“after image”。
  5. 将 before image 和 after image 保存至 undo log 表中。
  6. 生成行锁。

以上操作全部在一个数据库事务内完成,保证了一阶段操作的原子性。

二阶段(提交):
因为“业务 sql”在一阶段已经提交至数据库,所以 Seata 框架只需将一阶段保存的快照数据和行锁删掉,完成数据清理即可。

二阶段(回滚):

  1. 首先校验脏写,对比“数据库当前业务数据”和“after image”。
  2. 如果两份数据完全一致,说明没有脏写,可以用“before image”还原业务数据。
  3. 如果不一致,说明有脏写,出现脏写就需要转人工处理。
  4. 删除快照数据和行锁。

四、设计亮点

  1. 应用层基于 sql 解析实现了自动补偿,从而最大程度地降低业务侵入性。
  2. 将分布式事务中的 tc(事务协调者)独立部署,负责事务的注册、回滚。
  3. 通过全局锁实现了写隔离与读隔离。

五、Seata 快速开始

Seata Server(TC)环境搭建

  1. 下载安装包:从 Seata 官方 GitHub Releases 页面选择合适的版本下载。

  2. 事务信息存储配置

    • server 端存储模式支持 file(单机模式,默认)、db(高可用模式,需配置数据库连接信息)、redis(Seata Server 1.3 及以上版本支持,但存在事务信息丢失风险,需提前配置适合的 redis 持久化配置)等方式。这里以 db 模式为例,打开 conf/file.conf 文件,修改 mode = “db”,并设置数据库连接信息(url、user、password)。
    • 创建数据库 seata-server,并运行 server/db/mysql.sql 文件,该文件包含 global_table(存储全局事务的信息)、branch_table(存储事务参与者的信息)、lock_table(存储锁信息)三张表。
  3. Nacos(注册&配置中心)配置

    • 打开 conf/registry.conf,修改配置,将 seata server 注册到 Nacos。客户端配置 registry.conf 时,使用 Nacos 要注意 group 与 seata server 中的 group 一致(默认是"default_group")。
    • 启动注册中心 Nacos server(单机或集群模式均可)。
    • 获取/seata/script/config-center/config.txt 文件,修改配置信息,包括数据库相关配置和事务分组(例如:service.vgroupmapping.my_test_tx_group = default,事务分组可解决异地机房停电问题,提高容错性)。
  4. Seata 配置文件注册至 Nacos 配置中心

    • 下载 Git(Windows 环境需此工具才可运行.sh 文件)。
    • 获取/seata/script/config-center/nacos/nacos-config.sh 文件,可直接复制其内容并定义相同名称,或下载 script 文件夹。

Seata Client 代码实现

  1. 启动 seata server 端,seata server 使用 Nacos 作为配置中心和注册中心(上一步已完成)。

  2. 配置微服务整合 Seata:

    • 在业务库中增加 undo_log 表,可从 Seata 官方 GitHub 获取建表语句。
    • 在项目的 pom.xml 文件中添加相关依赖。
    • 在 application.yml 或其他配置文件中进行相应配置。
    • 在需要进行分布式事务的方法上添加@GlobalTransactional 注解。

分布式事务处理过程的基本概念和相关理论如下:

分布式事务基础

事务的特性(ACID 特性)

  1. 原子性(Atomicity):构成事务的所有操作,要么都执行完成,要么全部不执行,不可能出现部分成功部分失败的情况。
  2. 一致性(Consistency):在事务执行前后,数据库的一致性约束没有被破坏。例如转账前后的数据状态正确。
  3. 隔离性(Isolation):数据库中的事务一般都是并发的,隔离性指并发的两个事务的执行互不干扰,一个事务不能看到其他事务运行过程的中间状态。通过配置事务隔离级别可避免脏读、重复读等问题。
  4. 持久性(Durability):事务完成之后,该事务对数据的更改会被持久化到数据库,且不会被回滚。

本地事务与分布式事务

本地事务:在同一数据库和服务器的事务称为本地事务,通常利用关系型数据库本身的事务特性来实现,也叫数据库事务。

分布式事务:指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上,且属于不同的应用。分布式事务需要保证这些操作要么全部成功,要么全部失败,本质上是为了保证不同数据库的数据一致性。

分布式事务的引入:当一个应用系统拆分为可独立部署的多个服务,需要服务与服务之间远程协作才能完成事务操作,这种情况下的事务就是分布式事务,例如用户注册送积分事务、创建订单减库存事务、银行转账事务等。

分布式事务理论依据

  1. CAP 定律:在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)三者不可兼得。例如,保证数据一致性 c 和分区容错性 p 时,可能需要舍弃高可用性 a;若要保证高可用 a 和一致性 c,系统就不是分布式系统了。在分布式系统中,p 是必然存在的,所以只能在 c 和 a 之间进行取舍,由此诞生了 BASE 理论。
  2. BASE 理论:BASE 是 Basically Available(基本可用)、Soft State(软状态)和 Eventually Consistent(最终一致性)三个短语的缩写。它是对 CAP 中一致性和可用性权衡的结果,其核心思想是即使无法做到强一致性,但每个应用都可以根据自身业务特点,采用适当的方式使系统达到最终一致性。基本可用指允许损失部分可用性;软状态指允许系统中的数据存在中间状态;最终一致性强调所有数据副本经过一段时间的同步后,最终都能达到一致的状态。

其他分布式事务模式

  1. TCC 模式基本原理:分为 try-confirm-cancel 三个操作,类似服务化的两阶段提交协议。业务开发者需实现这三个服务接口,try 阶段进行资源预留,所有参与者的 try 接口成功后,事务管理器提交事务,并调用 confirm 接口真正提交业务操作,否则调用 cancel 接口回滚事务。其核心在于将业务分为两个操作步骤完成,不依赖 RM 对分布式事务的支持,而是通过对业务逻辑的分解来实现分布式事务。相对于 AT 模式,TCC 模式对业务代码有一定的入侵性,但 TCC 模式无 AT 模式的全局行锁,性能会更高。

TCC 模式需要注意 try-confirm-cancel 三个操作的幂等控制,以及空回滚(未收到 try 请求却收到 cancel 请求)和防悬挂(二阶段 cancel 请求比一阶段 try 请求先执行)问题的解决。

  1. Saga 模式:Saga 是一种补偿协议,适用于业务流程长且需要保证事务最终一致性的业务系统,尤其是无法进行改造和提供 TCC 要求接口的情况。在 Saga 模式下,分布式事务内有多个参与者,每一个参与者都是一个冲正补偿服务,需要用户根据业务场景实现其正向操作和逆向回滚操作。分布式事务执行过程中,依次执行各参与者的正向操作,如果所有正向操作均执行成功,那么分布式事务提交;如果任何一个正向操作执行失败,那么分布式事务会退回去执行前面各参与者。

六、Seata 事务隔离级别

Seata 支持读未提交、读已提交、可重复读和串行化四种隔离级别。默认情况下,Seata 采用读已提交隔离级别。

七、Seata 与其他分布式事务方案对比

与传统的两阶段提交(2PC)相比,Seata 的 AT 模式在性能和侵入性方面具有优势。2PC 存在协调者单点故障、同步阻塞等问题,而 Seata 通过对业务 SQL 的解析和补偿机制,降低了系统的复杂度和性能开销。

与消息队列实现的最终一致性方案相比,Seata 能够提供更强的事务一致性保证,但在某些对实时性要求不高的场景中,消息队列方案可能更具灵活性和扩展性。

八、Seata 应用场景

  1. 微服务架构下的跨服务事务处理,例如订单服务、库存服务和支付服务之间的事务协调。
  2. 多个数据库之间的数据一致性维护,特别是在数据分布在不同物理节点的情况下。
  3. 涉及多个外部系统的事务操作,通过 Seata 来确保整体事务的一致性。

九、Seata 监控与调试

Seata 提供了一些监控指标和日志信息,以便于对分布式事务的执行情况进行跟踪和分析。可以通过查看事务日志、监控事务的状态变化以及相关的性能指标,来及时发现和解决事务处理过程中出现的问题。

十、Seata 未来发展趋势

随着分布式系统的不断发展和应用场景的日益复杂,Seata 有望在性能优化、功能扩展、与更多技术框架的集成等方面不断演进,以更好地满足企业级应用对分布式事务处理的需求。

总之,Seata 作为一款优秀的分布式事务解决方案,为解决分布式环境下的数据一致性问题提供了有力的支持。在实际应用中,需要根据具体的业务场景和需求,合理选择事务模式和配置,以确保系统的稳定性和性能。

你可能感兴趣的:(springboot,Java,编程,spring,cloud,spring,boot,java)