Apache Seata的可观测实践

news2025/1/15 21:01:59

title: Seata的可观测实践
keywords: [Seata、分布式事务、数据一致性、微服务、可观测]
description: 本文介绍Seata在可观测领域的探索和实践
author: 刘戎-Seata

本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。

Seata简介

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

业务场景

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

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

在这里插入图片描述

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

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

在这里插入图片描述

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

Seata架构

在这里插入图片描述

其核心组件主要如下:

  • Transaction Coordinator(TC)

事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚。

  • Transaction Manager(TM)

控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议,TM定义全局事务的边界。

  • Resource Manager(RM)

控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚。RM负责定义分支事务的边界和行为。

Seata的可观测实践

为什么需要可观测?

  • 分布式事务消息链路较复杂

Seata在解决了用户易用性和分布式事务一致性这些问题的同时,需要多次TC与TM、RM之间的交互,尤其当微服务的链路变复杂时,Seata的交互链路也会呈正相关性增加。这种情况下,其实我们就需要引入可观测的能力来观察、分析事物链路。

  • 异常链路、故障排查难定位,性能优化无从下手

在排查Seata的异常事务链路时,传统的方法需要看日志,这样检索起来比较麻烦。在引入可观测能力后,帮助我们直观的分析链路,快速定位问题;为优化耗时的事务链路提供依据。

  • 可视化、数据可量化

可视化能力可让用户对事务执行情况有直观的感受;借助可量化的数据,可帮助用户评估资源消耗、规划预算。

可观测能力概览

可观测维度seata期望的能力技术选型参考
Metrics功能层面:可按业务分组隔离,采集事务总量、耗时等重要指标
性能层面:高度量性能,插件按需加载
架构层面:减少第三方依赖,服务端、客户端能够采用统一的架构,减少技术复杂度
兼容性层面:至少兼容Prometheus生态Prometheus:指标存储和查询等领域有着业界领先的地位
OpenTelemetry:可观测数据采集和规范的事实标准。但自身并不负责数据的存储,展示和分析
Tracing功能层面:全链路追踪分布式事务生命周期,反应分布式事务执行性能消耗
易用性方面:对使用seata的用户而言简单易接入SkyWalking:利用Java的Agent探针技术,效率高,简单易用。
Logging功能层面:记录服务端、客户端全部生命周期信息
易用性层面:能根据XID快速匹配全局事务对应链路日志Alibaba Cloud Service
ELK

Metrics维度

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

在这里插入图片描述

  • 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模块工作流

在这里插入图片描述

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

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

在这里插入图片描述

TM核心指标

在这里插入图片描述

RM核心指标

在这里插入图片描述

大盘展示

在这里插入图片描述

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。

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

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

Logging维度

设计思路

在这里插入图片描述

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

日志格式设计

这里拿Seata-Server的一个日志格式作为案例:
在这里插入图片描述

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

总结&展望

Metrics

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

Tracing

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

Logging

总结:结构化的日志格式。
展望:日志可观测体系演进。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1628669.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

matplotlib 安装失败:Failed building wheel for matplotlib 解决方案

Python | Failed building wheel for matplotlib 朋友遇到 python 安装 matplotlib 时的问题,笔者帮忙远程调试(踩了不少坑)。网上的解决方案有很多无效,以此来记录以下个人解决方案。 在使用指令 pip install matplotlib出现如下报错: “…

机器学习理论基础—集成学习(1)

机器学习理论基础—集成学习 个体与集成 集成学习通过构建并结合多个学习器来完成学习任务,有时也称为多分类系统等。 分类: 根据集成学习中的个体学习器的不同可以分为同质集成(集成的学习器相同例如全部是决策树)&#xff0c…

目标检测——农作物杂草数据集

引言 亲爱的读者们,您是否在寻找某个特定的数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。 …

centos 安装配置文件中心 nacos2.2.3 稳定版

安装mysql 8 参考文章 centos7搭建mysql5.6 && mysql 8.0_centos7 mysql5.6-CSDN博客 安装 jdk 17 官网下载 对应的版本 Java Downloads | Oracle wget https://download.java.net/java/GA/jdk17.0.2/dfd4a8d0985749f896bed50d7138ee7f/8/GPL/openjdk-17.0.2_l…

15(第十四章,大数据和数据科学)

目录 概述 基本概念 数据仓库/传统商务智能与数据科学的比较 数据科学的过程 大数据 大数据来源 数据湖 机器学习 监督学习 无监督学习 强化学习 扩展 1、数据仓库(Data Warehouse) 2、数据湖(Data Lake) 3、大数据平台1.0 4、数据中台 …

Visual Studio中怎样更改Nuget程序包源

场景 Visual Studio 2019 在使用NuGet添加依赖包时,在预览中搜索不到程序包。 排查下NuGet的程序包源为本地。 将程序包源修改下。 实现 在解决方案上右击选择管理解决方案中的NuGet程序包(在 Visual Studio 中打开“工具”>“选项”>“NuGet 包管理器”…

vim 插件01:插件管理神器pathogen

1、pathogen简介 Vim 插件 pathogen 是一款历史比较悠久的 Vim 插件管理器。Pathogen 的主要功能是提供一种模块化的方式来管理和加载 Vim 插件。说人话:vim是一款管理各类插件的插卡,使用它会让插件的安装和使用非常方便。 以下是 Pathogen 的主要特点…

高级STM32应用开发:使用HAL库和RTOS

引言 STM32系列微控制器以其高性能、丰富的外设支持和低功耗特性,在工业、汽车及消费电子市场中占有显著地位。 下面我们旨在探讨STM32的高级开发技术,包括硬件抽象层(HAL)库的使用和实时操作系统(RTOS)的…

python之excel加工处理小案例一则

一、工具用途 工作中,需要对各类excel进行加工处理,当表和字段比较多时,关联条件又有多个,每次通过execl的vlookup之类的关联公式手工可以解决工作需求,但一般耗时较长,且人工统计匹配也存在出错的情况。 …

Kafka学习笔记01【2024最新版】

一、Kafka-课程介绍 官网地址:Apache KafkaApache Kafka: A Distributed Streaming Platform.https://kafka.apache.org/ kafka 3.6.1版本,作为经典分布式订阅、发布的消息传输中间件,kafka在实时数据处理、消息队列、流处理等领域具有广泛…

利用yakit实现csrf (lucy争夺最帅男银的csrf之旅)

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 csrf原理:【web安全】CSRF漏洞攻击与防御-CSDN博客 文章主要内容提炼 本文主要讲利用yakit实现csrf的过程。 用pikachu靶场和内网环境做案例。 如需漏洞原理请点击上面原理的导航。 (因为我觉得yak…

RFID技术引领3C手机镜头模组产线智能化转型

RFID技术引领3C手机镜头模组产线智能化转型 应用背景 随着智能手机市场的快速发展与技术创新,手机镜头模组作为影像功能的核心组件,其生产精度、效率及供应链管理的重要性日益凸显。面对复杂多变的市场需求、严格的品质要求以及激烈的市场竞争&#xf…

01.JAVAEE初阶之计算机如何工作

1.一台机器如何组成 冯诺依曼体系 CPU 中央处理器: 进行算术运算和逻辑判断.存储器: 分为外存和内存, 用于存储数据(使用二进制方式存储)输入设备: 用户给计算机发号施令的设备.输出设备: 计算机个用户汇报结果的设备. 针对存储空间 硬盘 > 内存 >> CPU针对数据访问…

NodeJs[黑马笔记简洁版]

是什么 怎么用 模块 模块化标准 CommonJs(标准语法)默认 ECMAscript 内置模块 fs模块 path模块 http模块 自定义模块 第三方包 包概念 npm 包管理器 总结

Vue 使用Canvas画布手写电子版签名 保存 上传服务端

电子版签名效果 定义画布 <canvas width"500"height"250"ref"cn"mousedown"cnMouseDown"mousemove"cnMouseMove"mouseup"cnMouseUp"style"width:500px;height: 250px;background-color:snow;padding: 10p…

Nginx:高性能Web服务器与反向代理的卓越之选

目录 一、Nginx概述 二、Nginx的特点 三、Nginx架构图 四、Nginx优势 五、正向代理与反向代理 正向代理&#xff1a; 反向代理&#xff1a; 一、Nginx概述 Nginx&#xff08;engine x&#xff09;是一个由俄罗斯人Igor Sysoev开发的高性能HTTP和反向代理服务器。其历史背…

MySQL 数据库远程访问问题

在默认的情况下&#xff0c;MySQL 是不能远程访问的&#xff0c;当我们修改了用户名可以接受远程访问后&#xff0c;还是没有办法接受远程访问。 还有一个配置的地方需要验证。 mysqld.cnf 配置文件 mysqld.cnf 配置文件对访问的地址可能会有限制。 配置文件的地址为&#…

YoloV9改进策略:注意力改进、Neck层改进_自研全新的Mamba注意力_即插即用,简单易懂_附结构图_检测、分割、关键点均适用(独家原创,全世界首发)

摘要 无Mamba不狂欢,本文打造基于Mamba的注意力机制。全世界首发基于Mamba的注意力啊!对Mamba感兴趣的朋友一定不要错过啊! 基于Mamba的高效注意力代码和结构图 import torch import torch.nn as nn # 导入自定义的Mamba模块 from mamba_ssm import Mamba class Eff…

AI大模型系列:自然语言处理,从规则到统计的演变

自然语言处理&#xff0c;从规则到统计的演变 自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;是人工智能的一个重要分支&#xff0c;主要研究如何让计算机理解、解释和生成人类语言。从自然语言处理的字面上来看&#xff0c;最重要的是“语言…

css 文字左右抖动效果

<template><div class"box"><div class"shake shape">抖动特效交字11</div></div> </template><script setup></script><style scope> .shape {margin: 50px;width: 200px;height: 50px;line-heigh…