再前不久,我写了一篇关于分布式事务中间件 Fescar 的解析,没过几天 Fescar 团队对其进行了品牌升级,取名为 Seata(Simpe Extensible Autonomous Transaction Architecture),而以前的 Fescar 的英文全称为 Fast & EaSy Commit And Rollback。可以看见 Fescar 从名字上来看更加局限于 Commit 和 Rollback,而新的品牌名字 Seata 旨在打造一套一站式分布式事务解决方案。更换名字之后,我对其未来的发展更有信心。
这里先大概回忆一下 Seata 的整个过程模型:

- TM:事务的发起者。用来告诉 TC,全局事务的开始,提交,回滚。
- RM:具体的事务资源,每一个 RM 都会作为一个分支事务注册在 TC。
- TC:事务的协调者。也可以看做是 Fescar-server,用于接收我们的事务的注册,提交和回滚。
在之前的文章中对整个角色有个大体的介绍,在这篇文章中我将重点介绍其中的核心角色 TC,也就是事务协调器。
2.Transcation Coordinator
为什么之前一直强调 TC 是核心呢?那因为 TC 这个角色就好像上帝一样,管控着云云众生的 RM 和 TM。如果 TC 一旦不好使,那么 RM 和 TM 一旦出现小问题,那必定会乱的一塌糊涂。所以要想了解 Seata,那么必须要了解它的 TC。
那么一个优秀的事务协调者应该具备哪些能力呢?我觉得应该有以下几个:
- 正确的协调:能正确的协调 RM 和 TM 接下来应该做什么,做错了应该怎么办,做对了应该怎么办。
- 高可用: 事务协调器在分布式事务中很重要,如果不能保证高可用,那么它也没有存在的必要了。
- 高性能:事务协调器的性能一定要高,如果事务协调器性能有瓶颈那么它所管理的 RM 和 TM 那么会经常遇到超时,从而引起回滚频繁。
- 高扩展性:这个特点是属于代码层面的,如果是一个优秀的框架,那么需要给使用方很多自定义扩展,比如服务注册/发现,读取配置等等。
下面我也将逐步阐述 Seata 是如何做到上面四点。
2.1 Seata-Server 的设计

Seata-Server 整体的模块图如上所示:
- Coordinator Core: 在最下面的模块是事务协调器核心代码,主要用来处理事务协调的逻辑,如是否 commit,rollback 等协调活动。
- Store:存储模块,用来将我们的数据持久化,防止重启或者宕机数据丢失。
- Discovery: 服务注册/发现模块,用于将 Server 地址暴露给我们 Client。
- Config: 用来存储和查找我们服务端的配置。
- Lock: 锁模块,用于给 Seata 提供全局锁的功能。
- RPC:用于和其它端通信。
- HA-Cluster:高可用集群,目前还没开源,为 Seata 提供可靠的高可用服务,预计将会在 0.6 版本开源。
2.2 Discovery
首先来讲讲比较基础的 Discovery 模块,又称服务注册/发现模块。我们将 Seata-Sever 启动之后,需要将自己的地址暴露给其它使用者,那么就需要我们这个模块帮忙。

这个模块有个核心接口 RegistryService,如上图所示:
- register:服务端使用,进行服务注册。
- unregister:服务端使用,一般在 JVM 关闭钩子,ShutdownHook 中调用。
- subscribe:客户端使用,注册监听事件,用来监听地址的变化。
- unsubscribe:客户端使用,取消注册监听事件。
- lookup:客户端使用,根据 key 查找服务地址列表。
- close:都可以使用,用于关闭 Registry 资源。
如果需要添加自己定义的服务注册/发现,那么实现这个接口即可。截止目前在社区的不断开发推动下,已经有五种服务注册/发现,分别是 redis、zk、nacos、eruka 和 consul。下面简单介绍下 Nacos 的实现:
2.2.1 register 接口:

step1:校验地址是否合法
step2:获取 Nacos 的 Naming 实例,然后将地址注册到服务名为 serverAddr(固定服务名) 的对应集群分组(registry.conf 文件配置)上面。
unregister 接口类似,这里不做详解。