阿里分布式中间件Seata从入门到精通

简介: 阿里分布式中间件Seata从入门到精通

最近在写一本关于阿里巴巴分布式事务中间件 Seata 的电子书,Seata可以说是分布式事务中间件中最完善的了,包括了 AT、TCC、Saga、XA 四种模式,目前 Seata 已经更新到了 1.4.2 版本。

这本电子书主要分成两部分,第一部分是入门学习,目前已经更新完成,第二部分是源码解读,Seata 的源代码写的还可以,值得阅读。

整本书目前的目录结构如下:

微信图片_20221213103454.png

微信图片_20221213103514.png

喜欢的朋友欢迎下载学习获取方式:关注公众号,后台回复:Seata

下面简要介绍 Seata 的四种模式。

AT 模式

AT 模式参考了单数据库的事务原理,我们可以把分布式事务中每个数据库看做是单数据库的表。首先每个事务有一个全局的事务 id,叫做 xid。有了这个 xid 后,我们就可以记录undo_log 了,undo_log 中记录了这个 xid 对应回滚数据,每次提交事务前都要先写 undo_log,后提交事务,这参考了 mysql 中的 WAL 机制。而rollback_info 字段记录了要回滚的表的记录中的每个字段和对应值,这样就可以方便的回滚了。

AT模式的两阶段提交体现如下:

  • 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
  • 二阶段:异步 commit,非常快速地完成。rollback 则通过一阶段的回滚日志进行反向补偿

AT 模式读写都有隔离性,这里简单描述。

写隔离

  • 一阶段本地事务提交前,需要确保先拿到**全局锁* 。
  • 拿不到全局锁 ,不能提交本地事务。
  • 全局锁的尝试会有超时时间限制,超出范围将放弃,并回滚本地事务,释放本地锁。

上面是官网的描述,非常容易理解,如果获取不到全局锁,就不能提交本地事务,只能等待全局锁直到超时。

读隔离

AT模式的读隔离需要本地事务隔离级别在读已提交或以上,AT 模式默认的全局隔离级别是读未提交

如果应用在特定场景下,必需要求全局的读已提交 ,Seata 需要通过 SELECT FOR UPDATE 语句代理来实现。

SELECT FOR UPDATE 语句的执行会申请全局锁 ,如果全局锁被其他事务持有,则释放本地锁并重试。这个过程中,查询是被 block 住的,直到全局锁拿到。

TCC 模式

简单来讲,TCC模式就是将整个事务分成两个阶段来提交,try阶段进行预留资源,如果所有分支都预留成功,则进入commit阶段提交所有分支事务,否则执行cancel取消所有分支事务。

以电商系统为例,假如有订单、库存和账户3个服务,客户购买一件商品,订单服务增加订单,库存服务扣减库存,账户服务扣减金额,这三个操作必须是原子性的,要么全部成功,要么全部失败。

try阶段

如下图:

微信图片_20221213103542.png

订单服务增加一个订单,库存服务冻结订单上的库存,账户服务冻结订单上的金额。这个阶段数据进入中间态。

commit阶段

如下图:

微信图片_20221213103602.png

commit阶段,数据从中间态转入终态,比如订单金额从中间账户转到最终账户。

cancel阶段跟commit阶段类似,比如订单金额从中间账户退回到客户账户。

Saga 模式

Saga 模式适用于长流程的业务场景,用状态机来控制整个事务的执行。它使用状态图定义服务调用流程并生成 Json 状态语言定义文件,状态图的节点可以是一个服务,也可以是补偿节点。

下面这张图定义了电商系统的业务流程,根据这个流程图可以定义出 Json 文件中供状态机使用。

微信图片_20221213103628.png

XA 模式

XA 模式需要分支事务数据库支持 XA 原语,看一下官方这张图:

微信图片_20221213103652.png

XA 模式的两阶段提交跟 TCC 模式的两阶段提交类似,都是由 TM 开启全局事务,RM 向 TC注册分支事务并且报告分支事务状态,TC 根据全局事务的状态来提交或回滚分支事务。

而在代码实现上,XA 模式使用的是数据源代理来实现的。跟 TCC 模式不同的是,XA 模式只要有 prepare 方法即可。

Seata 对XA做了优化,把 Start | SQL | Prepare 合成了一个阶段。这对 MySQL 数据库是支持的,但是对 Oracle 数据库不支持。

最后,欢迎大家支持这本电子书,后面我会逐渐完善第二部分,我个人非常推荐。

相关文章
|
12月前
|
消息中间件 存储 Kafka
分布式消息中间件设计与实现
本文深入探讨了消息中间件的核心功能实现与高并发、高可用设计。在生产者设计中,涵盖消息构造、序列化、路由策略及可靠性保障(如ACK机制)。消费者部分分析了拉取/推送模式、分区分配与消息确认机制。同时,Broker作为核心组件,负责消息路由、存储和投递,并通过索引技术实现快速检索。 高并发设计方面,重点讨论了文件存储(顺序写入、分段存储)、日志结构存储及负载均衡策略(如哈希分区、轮询分区)。为确保高可用性,文章详细解析了主从复制、故障转移机制以及同城/异地多活容灾方案。
433 13
|
8月前
|
存储 算法 安全
“卧槽,系统又崩了!”——别慌,这也许是你看过最通俗易懂的分布式入门
本文深入解析分布式系统核心机制:数据分片与冗余副本实现扩展与高可用,租约、多数派及Gossip协议保障一致性与容错。探讨节点故障、网络延迟等挑战,揭示CFT/BFT容错原理,剖析规模与性能关系,为构建可靠分布式系统提供理论支撑。
370 2
|
8月前
|
消息中间件 缓存 监控
中间件架构设计与实践:构建高性能分布式系统的核心基石
摘要 本文系统探讨了中间件技术及其在分布式系统中的核心价值。作者首先定义了中间件作为连接系统组件的"神经网络",强调其在数据传输、系统稳定性和扩展性中的关键作用。随后详细分类了中间件体系,包括通信中间件(如RabbitMQ/Kafka)、数据中间件(如Redis/MyCAT)等类型。文章重点剖析了消息中间件的实现机制,通过Spring Boot代码示例展示了消息生产者的完整实现,涵盖消息ID生成、持久化、批量发送及重试机制等关键技术点。最后,作者指出中间件架构设计对系统性能的决定性影响,
|
存储 SQL 分布式数据库
OceanBase 入门:分布式数据库的基础概念
【8月更文第31天】在当今的大数据时代,随着业务规模的不断扩大,传统的单机数据库已经难以满足高并发、大数据量的应用需求。分布式数据库应运而生,成为解决这一问题的有效方案之一。本文将介绍一款由阿里巴巴集团自主研发的分布式数据库——OceanBase,并通过一些基础概念和实际代码示例来帮助读者理解其工作原理。
1404 0
|
12月前
|
消息中间件 存储 中间件
分布式消息中间件基础
消息中间件是一种基于异步消息传递的分布式系统通信工具,核心功能包括消息传输、存储、路由与投递,能够实现系统解耦、异步处理和流量削峰。其主要组件包括生产者、消费者、Broker、主题/队列等,支持点对点和发布-订阅两种消息模型。主流中间件如Kafka(高吞吐)、RabbitMQ(灵活路由)、RocketMQ(事务支持)各有特色,适用于不同场景。此外,中间件还涉及多种协议(AMQP、MQTT等)、可靠性传输机制(持久化、确认机制)、顺序性与重复性问题解决以及事务支持(两阶段提交、本地消息表等)。选择中间件需根据业务需求权衡性能、功能和运维成本。
557 6
|
消息中间件 关系型数据库 Java
‘分布式事务‘ 圣经:从入门到精通,架构师尼恩最新、最全详解 (50+图文4万字全面总结 )
本文 是 基于尼恩之前写的一篇 分布式事务的文章 升级而来 , 尼恩之前写的 分布式事务的文章, 在全网阅读量 100万次以上 , 被很多培训机构 作为 顶级教程。 此文修改了 老版本的 一个大bug , 大家不要再看老版本啦。
|
消息中间件 架构师 Java
阿里面试:秒杀的分布式事务, 是如何设计的?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴在面试阿里、滴滴、极兔等一线互联网企业时,遇到了许多关于分布式事务的重要面试题。为了帮助大家更好地应对这些面试题,尼恩进行了系统化的梳理,详细介绍了Seata和RocketMQ事务消息的结合,以及如何实现强弱结合型事务。文章还提供了分布式事务的标准面试答案,并推荐了《尼恩Java面试宝典PDF》等资源,帮助大家在面试中脱颖而出。
|
消息中间件 中间件 数据库
NServiceBus:打造企业级服务总线的利器——深度解析这一面向消息中间件如何革新分布式应用开发与提升系统可靠性
【10月更文挑战第9天】NServiceBus 是一个面向消息的中间件,专为构建分布式应用程序设计,特别适用于企业级服务总线(ESB)。它通过消息队列实现服务间的解耦,提高系统的可扩展性和容错性。在 .NET 生态中,NServiceBus 提供了强大的功能,支持多种传输方式如 RabbitMQ 和 Azure Service Bus。通过异步消息传递模式,各组件可以独立运作,即使某部分出现故障也不会影响整体系统。 示例代码展示了如何使用 NServiceBus 发送和接收消息,简化了系统的设计和维护。
377 3
|
Dubbo Java 应用服务中间件
分布式-dubbo的入门
分布式-dubbo的入门
|
前端开发 中间件 索引
Django入门到放弃之中间件
Django入门到放弃之中间件

热门文章

最新文章