首页 > 其他分享 >Seata 的可观测实践

Seata 的可观测实践

时间:2023-05-22 11:55:46浏览次数:47  
标签:事务 场景 Seata 实践 观测 链路 日志 分布式

作者:察溯

Seata 简介

Seata 的前身是阿里巴巴集团内大规模使用保证分布式事务一致性的中间件,Seata 是其开源产品,由社区维护。在介绍 Seata 前,先与大家讨论下我们业务发展过程中经常遇到的一些问题场景。

业务场景

我们业务在发展的过程中,基本上都是从一个简单的应用,逐渐过渡到规模庞大、业务复杂的应用。这些复杂的场景难免遇到分布式事务管理问题,Seata 的出现正是解决这些分布式场景下的事务管理问题。介绍下其中几个经典的场景:

场景一:分库分表场景下的分布式事务

image

起初我们的业务规模小、轻量化,单一数据库就能保障我们的数据链路。但随着业务规模不断扩大、业务不断复杂化,通常单一数据库在容量、性能上会遭遇瓶颈。通常的解决方案是向分库、分表的架构演进。此时,即引入了分库分表场景下的分布式事务场景。

场景二:跨服务场景下的分布式事务

image.png

降低单体应用复杂度的方案:应用微服务化拆分。拆分后,我们的产品由多个功能各异的微服务组件构成,每个微服务都使用独立的数据库资源。在涉及到跨服务调用的数据一致性场景时,就引入了跨服务场景下的分布式事务。

Seata 架构

image.png

  • Transaction Coordinator(TC) 事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚。
  • Transaction Manager(TM) 控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议,TM 定义全局事务的边界。
  • Resource Manager(RM) 控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚。RM 负责定义分支事务的边界和行为。

Seata 的可观测实践

为什么需要可观测?

  • 分布式事务消息链路较复杂Seata 在解决了用户易用性和分布式事务一致性这些问题的同时,需要多次 TC 与 TM、RM 之间的交互,尤其当微服务的链路变复杂时,Seata 的交互链路也会呈正相关性增加。这种情况下,其实我们就需要引入可观测的能力来观察、分析事物链路。
  • 异常链路、故障排查难定位,性能优化无从下手在排查 Seata 的异常事务链路时,传统的方法需要看日志,这样检索起来比较麻烦。在引入可观测能力后,帮助我们直观的分析链路,快速定位问题;为优化耗时的事务链路提供依据。
  • 可视化、数据可量化可视化能力可让用户对事务执行情况有直观的感受;借助可量化的数据,可帮助用户评估资源消耗、规划预算。

可观测能力概览

image

Metrics 维度

设计思路

  1. Seata 作为一个被集成的数据一致性框架,Metrics 模块将尽可能少的使用第三方依赖以降低发生冲突的风险
  2. Metrics 模块将竭力争取更高的度量性能和更低的资源开销,尽可能降低开启后带来的副作用
  3. 配置时,Metrics 是否激活、数据如何发布,取决于对应的配置;开启配置则自动启用,并默认将度量数据通过 prometheusexporter 的形式发布
  4. 不使用 Spring,使用 SPI(Service Provider Interface) 加载扩展

模块设计

image

  • seata-metrics-core:Metrics 核心模块,根据配置组织(加载)1 个 Registry 和 N 个 Exporter
  • seata-metrics-api:定义了 Meter 指标接口,Registry 指标注册中心接口
  • seata-metrics-exporter-prometheus:内置的 prometheus-exporter 实现
  • seata-metrics-registry-compact:内置的 Registry 实现,并轻量级实现了 Gauge、Counter、Summay、Timer 指标

metrics 模块工作流

image.png

上图是 metrics 模块的工作流,其工作流程如下:

  1. 利用 SPI 机制,根据配置加载 Exporter 和 Registry 的实现类
  2. 基于消息订阅与通知机制,监听所有全局事务的状态变更事件,并 publish 到EventBus
  3. 事件订阅者消费事件,并将生成的 metrics 写入 Registry
  4. 监控系统(如 prometheus)从 Exporter 中拉取数据

TC 核心指标

image.png

TM 核心指标

image.png

RM 核心指标

image

大盘展示

image

Tracing维度

Seata 为什么需要 tracing?

  1. 对业务侧而言,引入 Seata 后,对业务性能会带来多大损耗?主要时间消耗在什么地方?如何针对性的优化业务逻辑?这些都是未知的。
  2. Seata 的所有消息记录都通过日志持久化落盘,但对不了解 Seata 的用户而言,日志非常不友好。能否通过接入 Tracing,提升事务链路排查效率?
  3. 对于新手用户,可通过 Tracing 记录,快速了解 Seata 的工作原理,降低 Seata 使用门槛。

Seata 的 tracing 解决方案

  • Seata 在自定义的 RPC 消息协议中定义了 Header 信息
  • SkyWalking 拦截指定的 RPC 消息,并注入 tracing 相关的 span 信息
  • 以 RPC 消息的发出&接收为临界点,定义了 span 的生命周期范围

基于上述的方式,Seata 实现了事务全链路的 tracing,具体接入可参考为[Seata 应用 | Seata-server]接入 Skywalking [ 1]

tracing 效果

  • 基于的 demo 场景:
  1. 用户请求交易服务
  2. 交易服务锁定库存
  3. 交易服务创建账单
  4. 账单服务进行扣款

image.png

  • GlobalCommit 成功的事务链路(事例)

image.png

image

image

Logging 维度

设计思路

image.png

Logging 这一块其实承担的是可观测这几个维度当中的兜底角色。放在最底层的,其实就是我们日志格式的设计,只有好日志格式,我们才能对它进行更好的采集、模块化的存储和展示。在其之上,是日志的采集、存储、监控、告警、数据可视化,这些模块更多的是有现成的工具,比如阿里的 SLS 日志服务、还有 ELK 的一套技术栈,我们更多是将开销成本、接入复杂度、生态繁荣度等作为考量。

日志格式设计

这里拿 Seata-Server 的一个日志格式作为案例:

image.png

  • 线程池规范命名:当线程池、线程比较多时,规范的线程命名能将无序执行的线程执行次序清晰展示
  • 方法全类名可追溯:快速定位到具体的代码块
  • 重点运行时信息透出:重点突出关键日志,不关键的日志不打印,减少日志冗余
  • 消息格式可扩展:通过扩展消息类的输出格式,减少日志的代码修改量

总结&展望

Metrics

总结:基本实现分布式事务的可量化、可观测。展望:更细粒度的指标、更广阔的生态兼容。

Tracing

总结:分布式事务全链路的可追溯。展望:根据 xid 追溯事务链路,异常链路根因快速定位。

Logging

总结:结构化的日志格式。展望:日志可观测体系演进。Seata-go 是 Seata 的多语言规划的重要一环,目前处在高速发展时期,欢迎大家一起加入建设。如果你对 Seata 有任何问题,欢迎通过钉钉搜索群号加入我们。(钉钉群号:33069364)

相关链接:

[1] 为[Seata 应用 | Seata-server]接入 Skywalking

https://seata.io/zh-cn/docs/user/apm/skywalking.html

标签:事务,场景,Seata,实践,观测,链路,日志,分布式
From: https://www.cnblogs.com/alisystemsoftware/p/17420240.html

相关文章

  • 【实践篇】领域驱动设计:DDD工程参考架构
    背景为什么要制定参考工程架构不同团队落地DDD所采取的应用架构风格可能不同,并没有统一的、标准的DDD工程架构。有些团队可能遵循经典的DDD四层架构,或改进的DDD四层架构,有些团队可能综合考虑分层架构、整洁架构、六边形架构等多种架构风格,有些在实践中可能引入CQRS解决读模型与......
  • web Service实践——Xfire的ws-security用户名和密码安全验证
    一、参照《WebService实践之——XFire实例》(本空间的文章)建立一个Xfire的应用;二、引入的jar包:xfire-1.2.6的所有jar包(包括xfire-all-1.2.6.jar),下载地址:http://xfire.codehaus.org/Downloadwss4j-1.5.8.jar:下载地址:http://ws.apache.org/wss4j/三、服务器端1、PasswordHandler类,继......
  • 【FPGA】Verilog 实践:奇偶校验生成器 | 奇偶校验检查器 | 2-bit 二进制比较器
    写在前面:ParitybitGenerator/Checker和2bitbinarycomparator的了解和确认动作。使用Verilog进行ParitybitGenerator/Checker、2bitbinary,实施comparator,生成输入信号后确认通过模拟器实现的每个Gate操作,通过FPGA验证Verilog实现的电路的行为。Ⅰ.前置知识0x00......
  • 5个编写高效Makefile文件的最佳实践
    在软件开发过程中,Makefile是一个非常重要的工具,它可以帮助我们自动化构建、编译、测试和部署。然而,编写高效的Makefile文件并不是一件容易的事情。在本文中,我们将讨论如何编写高效的Makefile文件,以提高我们的开发效率和产品质量确定目标在编写Makefile文件之前,我们需要明确我......
  • 5个编写高效Makefile文件的最佳实践
    在软件开发过程中,Makefile是一个非常重要的工具,它可以帮助我们自动化构建、编译、测试和部署。然而,编写高效的Makefile文件并不是一件容易的事情。在本文中,我们将讨论如何编写高效的Makefile文件,以提高我们的开发效率和产品质量确定目标在编写Makefile文件之前,我们需要明确我......
  • 聊聊Seata分布式解决方案AT模式的实现原理
    什么是Seata分布式事务解决方案Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。为用户提供了AT、TCC、SAGA和XA事务模式,为用户打造一站式的分布式解决方案。AT模式AT模式目前来看是Seata框架独有的一种模式,其它的分布式框架上并没有此种模式......
  • boot-admin 项目数据库缺省字段设计之最佳实践
    数据库(Database)中的缺省字段(也称为默认字段),就是在一般情况下,每个数据表(Table)必须包含的字段(Field),这类字段用于满足特定的数据需求,字段值的填充或更改一般遵照一定的逻辑要求。缺省字段的设计应该考虑到数据的完整性和一致性,以确保数据的正确与可靠,设计合理的表字段对于数据的有效......
  • 通过docker启动seata-server
    1、获取镜像(需要获取和自己依赖匹配的版本),这里我获取的是1.4.2dockerpullseataio/seata-server:1.4.22、启动镜像,将seata-server的配置文件复制到当前系统中随便启动以下dockerrun--nameseata-server-p8091:8091-dseataio/seata-server:1.4.2将配置文件所在的文件......
  • docker从入门到实践学习笔记【环境ubuntu16.04】【一】
    镜像加速国内从DockerHub拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker官方和国内很多云服务商都提供了国内加速器服务,例如: Docker官方提供的中国registrymirrorhttps://registry.docker-cn.com七牛云加速器https://reg-mirror.qiniu.com/ 我们以Docker官......
  • docker从入门到实践学习笔记【环境ubuntu16.04】【二】
     目录获取镜像 运行容器列出镜像虚悬镜像中间层镜像 删除本地镜像批量删除镜像  镜像是docker的三大组件之一。Docker运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker会从镜像仓库下载该镜像。 获取镜像 从Docker镜像仓库获取镜像的命令是dockerpull。......