Seata 简介
Cloud Native
Seata 的前身是阿里巴巴集团内大规模使用保证分布式事务一致性的中间件,Seata 是其开源产品,由社区维护。在介绍 Seata 前,先与大家讨论下我们业务发展过程中经常遇到的一些问题场景。
Seata 架构
事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚。
控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议,TM 定义全局事务的边界。
控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚。RM 负责定义分支事务的边界和行为。
Seata 的可观测实践
Cloud Native
Seata 在解决了用户易用性和分布式事务一致性这些问题的同时,需要多次 TC 与 TM、RM 之间的交互,尤其当微服务的链路变复杂时,Seata 的交互链路也会呈正相关性增加。这种情况下,其实我们就需要引入可观测的能力来观察、分析事物链路。
在排查 Seata 的异常事务链路时,传统的方法需要看日志,这样检索起来比较麻烦。在引入可观测能力后,帮助我们直观的分析链路,快速定位问题;为优化耗时的事务链路提供依据。
Seata 作为一个被集成的数据一致性框架,Metrics 模块将尽可能少的使用第三方依赖以降低发生冲突的风险
Metrics 模块将竭力争取更高的度量性能和更低的资源开销,尽可能降低开启后带来的副作用
配置时,Metrics 是否激活、数据如何发布,取决于对应的配置;开启配置则自动启用,并默认将度量数据通过 prometheusexporter 的形式发布
seata-metrics-core:Metrics 核心模块,根据配置组织(加载)1 个 Registry 和 N 个 Exporter
seata-metrics-api:定义了 Meter 指标接口,Registry 指标注册中心接口
seata-metrics-exporter-prometheus:内置的 prometheus-exporter 实现
上图是 metrics 模块的工作流,其工作流程如下:
利用 SPI 机制,根据配置加载 Exporter 和 Registry 的实现类
基于消息订阅与通知机制,监听所有全局事务的状态变更事件,并 publish 到EventBus
事件订阅者消费事件,并将生成的 metrics 写入 Registry
对业务侧而言,引入 Seata 后,对业务性能会带来多大损耗?主要时间消耗在什么地方?如何针对性的优化业务逻辑?这些都是未知的。
Seata 的所有消息记录都通过日志持久化落盘,但对不了解 Seata 的用户而言,日志非常不友好。能否通过接入 Tracing,提升事务链路排查效率?
Seata 在自定义的 RPC 消息协议中定义了 Header 信息
SkyWalking 拦截指定的 RPC 消息,并注入 tracing 相关的 span 信息
基于上述的方式,Seata 实现了事务全链路的 tracing,具体接入可参考为[Seata 应用 | Seata-server]接入 Skywalking[1]。
基于的 demo 场景:
线程池规范命名:当线程池、线程比较多时,规范的线程命名能将无序执行的线程执行次序清晰展示
方法全类名可追溯:快速定位到具体的代码块
重点运行时信息透出:重点突出关键日志,不关键的日志不打印,减少日志冗余
消息格式可扩展:通过扩展消息类的输出格式,减少日志的代码修改量
总结&展望
Cloud Native