分布式事务中间件 Seata学习系列之一:初识Seata

本文涉及的产品
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介: 本文主要介绍了分布式事务的概念以及当前分布式事务存在的不足之处,同时着重介绍了Seata分布式事务处理机制以及的优势之处。

引言

微服务已经不是什么新鲜话题了,越来越多的公司在进行微服务改造以及相关的探索实践工作。相关的框架也比较多,例如Spring CloudDubbo等都是非常优秀的分布式框架。分布式服务在飞速发展,给我们带来减少业务耦合、独立部署等诸多优点的同时,也带来了维护成本高、系统复杂度上升等问题,其中尤为突出的就是分布式事务。当前市面上已经有一些分布式事务的解决方案,但是或多或少都存在这样或者那样的问题。本系列文章主要介绍阿里巴巴开源的分布式解决方案Seata是如何解决分布式事务痛点问题的。

  • 什么是分布式事务
  • 当前分布式事务痛点
  • Seata是何方神圣
  • 总结

一、什么是分布式事务

事务的概念大家应该都比较清楚了,这里简单回顾下。完成一项事情需要好几个操作,而事务就是将这些操作包裹成一个不可分割的执行单元,在这个执行单元中,只有当所有的操作都正常完成,这个执行单元才可以进行完整提交。但是如果该单元中有任何的操作失败,则整个单元无法提交,需要回滚至执行操作之前的状态, 可以这么说事务是天蝎座的,要么就要全部的爱,要么就不爱,从来不是半糖主义。正所谓要么什么都不做,要么就做全套(All or Nothing)。

image.png

所谓分布式事务就是事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同服务器节点之上。简单来说就是完成事务中的各个操作都是分布在不同的服务器节点上,分布式事务需要保证这些不同服务器的给个操作要么都成功,要么都失败。


分布式事务的产生主要是伴随着微服务的高速发展而来的,服务节点的不断扩充以及资源节点的分布式为分布式事务问题的产生奠定物理基础。

二、当前分布式事务痛点

既然分布式事务使我们在微服务改造以及开拓路上不得不面对的问题,那么目前针对该问题都有哪些解决方案呢?我们一起来看下。分布式事务的解决方案主要可以分为对使用方业务有侵入性的以及无侵入性的。

1、基于数据库 XA 协议的两段式提交(2PC)方案

该方案是一种业务无侵入的实现方案。它要求本地数据库支持 XA 协议,且由于 XA 协议自身的特点,它会造成事务资源长时间得不到释放,锁定周期长,而且在应用层上面无法干预,因此它性能很差,它的存在相当于七伤拳那样“伤人七分,损己三分”,因此在互联网项目中并不是很流行这种解决方案。


使用两阶段提交来完成一个全局事务, XA 规范的基础是两阶段提交协议。

第一阶段是表决阶段,所有参与者都将本事务能否成功的信息反馈发给协调者;第二阶段是执行阶段,协调者根据所有参与者的反馈,通知所有参与者,步调一致地在所有分支上提交或者回滚。

image.png

image.png

2、TCC(Try-Confirm-Cancel)方案


TCC 其实就是采用的补偿机制,其核心思想是:针对每个操作,都要注册一个与其对应的确认和补偿(撤销)操作。它分为三个阶段:


(1)try

一般都是锁定某个资源,设置一个预备类的状态,冻结部分数据,。简单的说就是通知各个业务被调方预留相关的业务资源。


(2)confirm

确认执行各个业务方的资源操作


(2)cancel

取消执行每个业务方的资源操作

三、Seata是何方神圣

1、什么是Seata

Seata(Simpe Extensible Autonomous Transcaction Architecture)那么什么样的分布式事务解决方案才是好呢,我想应该是对于现有业务无侵入同时满足高性能的解决方案。Seata`便是一种高性能、方便使用且对业务零侵入的针对微服务的一种分布式事务解决方案。


如下图所示,可以看下Seata是如何解决分布式事务的,如下所示,Seata 的设计思路是将一个分布式事务可以理解成一个全局事务,下面挂了若干个分支事务,而一个分支事务是一个满足 ACID 的本地事务,因此我们可以操作分布式事务像操作本地事务一样。

image.png

在Seata中包含了三种基本的组件来处理全局事务与分支事务的状态维护与管理,分别如下:

(1)Transaction Coordinator(TC):事务协调器。维护全局和分支事务的状态,驱动全局事务进行提交或回滚。

(2)Transaction Manager™:事务管理器。定义全局事务的范围,开启一个全局事务、提交或者回滚一个事务。

(3)Resource Manager(RM):资源管理器。管理处于运作的分支事务的资源,与事务协调器协作,包括注册分支事务以及报告分支事务的状态,驱动分支事务的提交与回滚。

如下图所示:

image.png

我们一起看下Seata中的全局事务的大致执行步骤是怎样的,如下:


(1)TM 向 TC 申请开启一个全局分布式事务,TC 创建全局事务后返回全局唯一的 XID,XID 会在涉及微服务的整个全局事务的上下文中进行传播;

(2)RM 向 TC 注册本地分支事务,该分支事务归属于拥有相同 XID 的全局事务;

(3)TM 向 TC 发起全局事务的提交或回滚,对应于响应的XID;

(4)TC 调度并且驱动 XID 下的分支事务完成提交或者回滚。

image.png

2、项目引入

在项目中进行maven引入

<seata.version>0.8.0</seata.version>
<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-all</artifactId>
    <version>${seata.version}</version>
</dependency>

四、总结

本文主要介绍了分布式事务的概念以及当前分布式事务存在的不足之处,同时着重介绍了Seata分布式事务处理机制以及的优势之处。

相关文章
|
5天前
|
消息中间件 算法 调度
分布式系统学习10:分布式事务
本文是小卷关于分布式系统架构学习系列的第13篇,重点探讨了分布式事务的相关知识。随着业务增长,单体架构拆分为微服务后,传统的本地事务无法满足需求,因此需要引入分布式事务来保证数据一致性。文中详细介绍了分布式事务的必要性、实现方案及其优缺点,包括刚性事务(如2PC、3PC)和柔性事务(如TCC、Saga、本地消息表、MQ事务、最大努力通知)。同时,还介绍了Seata框架作为开源的分布式事务解决方案,提供了多种事务模式,简化了分布式事务的实现。
25 5
|
10天前
|
NoSQL 关系型数据库 MySQL
分布式系统学习9:分布式锁
本文介绍了分布式系统中分布式锁的概念、实现方式及其应用场景。分布式锁用于在多个独立的JVM进程间确保资源的互斥访问,具备互斥、高可用、可重入和超时机制等特点。文章详细讲解了三种常见的分布式锁实现方式:基于Redis、Zookeeper和关系型数据库(如MySQL)。其中,Redis适合高性能场景,推荐使用Redisson库;Zookeeper适用于对一致性要求较高的场景,建议基于Curator框架实现;而基于数据库的方式性能较低,实际开发中较少使用。此外,还探讨了乐观锁和悲观锁的区别及适用场景,并介绍了如何通过Lua脚本和Redis的`SET`命令实现原子操作,以及Redisson的自动续期机
46 7
|
3月前
|
存储 Java 关系型数据库
在Spring Boot中整合Seata框架实现分布式事务
可以在 Spring Boot 中成功整合 Seata 框架,实现分布式事务的管理和处理。在实际应用中,还需要根据具体的业务需求和技术架构进行进一步的优化和调整。同时,要注意处理各种可能出现的问题,以保障分布式事务的顺利执行。
197 53
|
29天前
|
Java 关系型数据库 数据库
微服务SpringCloud分布式事务之Seata
SpringCloud+SpringCloudAlibaba的Seata实现分布式事务,步骤超详细,附带视频教程
49 1
|
2月前
|
消息中间件 SQL 中间件
大厂都在用的分布式事务方案,Seata+RocketMQ带你打破10万QPS瓶颈
分布式事务涉及跨多个数据库或服务的操作,确保数据一致性。本地事务通过数据库直接支持ACID特性,而分布式事务则需解决跨服务协调难、高并发压力及性能与一致性权衡等问题。常见的解决方案包括两阶段提交(2PC)、Seata提供的AT和TCC模式、以及基于消息队列的最终一致性方案。这些方法各有优劣,适用于不同业务场景,选择合适的方案需综合考虑业务需求、系统规模和技术团队能力。
281 7
|
3月前
|
数据库
如何在Seata框架中配置分布式事务的隔离级别?
总的来说,配置分布式事务的隔离级别是实现分布式事务管理的重要环节之一,需要认真对待和仔细调整,以满足业务的需求和性能要求。你还可以进一步深入研究和实践 Seata 框架的配置和使用,以更好地应对各种分布式事务场景的挑战。
135 60
|
3月前
|
消息中间件 运维 数据库
Seata框架和其他分布式事务框架有什么区别
Seata框架和其他分布式事务框架有什么区别
47 1
|
4月前
|
NoSQL Java Redis
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
|
2月前
|
存储 NoSQL Java
使用lock4j-redis-template-spring-boot-starter实现redis分布式锁
通过使用 `lock4j-redis-template-spring-boot-starter`,我们可以轻松实现 Redis 分布式锁,从而解决分布式系统中多个实例并发访问共享资源的问题。合理配置和使用分布式锁,可以有效提高系统的稳定性和数据的一致性。希望本文对你在实际项目中使用 Redis 分布式锁有所帮助。
181 5
|
3月前
|
NoSQL Java 数据处理
基于Redis海量数据场景分布式ID架构实践
【11月更文挑战第30天】在现代分布式系统中,生成全局唯一的ID是一个常见且重要的需求。在微服务架构中,各个服务可能需要生成唯一标识符,如用户ID、订单ID等。传统的自增ID已经无法满足在集群环境下保持唯一性的要求,而分布式ID解决方案能够确保即使在多个实例间也能生成全局唯一的标识符。本文将深入探讨如何利用Redis实现分布式ID生成,并通过Java语言展示多个示例,同时分析每个实践方案的优缺点。
95 8