分布式系统架构6:链路追踪
这是小卷对分布式系统架构学习的第6篇文章,关于链路追踪,之前写过traceId的相关内容:https://juejin.cn/post/7135611432808218661,不过之前写的太浅了,且不成系统,只是简单的理解,今天来捋一下链路追踪的理论
1.为什么需要链路追踪
在复杂的分布式系统中,系统通常由多个独立的服务组成,几乎每一个前端请求都会形成一个复杂的分布式服务调用链路。
这种复杂的系统会带来一系列问题:
1.如何快速定位问题,判断故障影响范围?
2.如何梳理服务间的依赖关系?
链路追踪的用途就是为了知道请求在系统中的流转路径,定位性能瓶颈,诊断故障等。
2.追踪与跨度
要理解链路追踪的原理,先理解Trace追踪 和 Span跨度两个概念。
- Trace(追踪):一个完整的用户请求流程,从用户发起请求开始,到请求结束。一个追踪包含多个 Span。
- Span(跨度):一种表示工作单元的结构,通常对应着请求经过的某个服务或者操作,每个Span包含以下信息:
- Span ID:唯一标识当前Span
- Trace ID:标识属于同一个Trace的所有Span
- 父Span ID:如果当前Span由另一个Span引发,则会记录父Span ID
- 时间戳、标签和日志
每一次Trace是由若干个有顺序、有层级关系的Span组成的一棵追踪树结构,图片来源Dapper论文
3.链路追踪的概念
从广义上,分布式链路追踪系统可以分为三个部分:数据收集、数据存储、数据展示。
从狭义上,指链路追踪的数据收集部分
比如:Spring Cloud Sleuth就属于狭义的追踪系统,通常会搭配 Zipkin 作为数据展示,搭配 Elasticsearch 作为数据存储来组合使用。
这里从Dapper论文的内容总结下链路追踪的设计目标如下:
- 低开销:追踪系统对正在运行的服务应该具备很小的性能影响
- 应用层透明性:开发人员无需关注追踪系统,作为业务组件,尽可能减少对业务系统的代码侵入性。使用时透明,减少开发负担。如果需要依赖开发者配合才能使追踪系统生效,这样是无法满足追踪系统“无所不在的部署”这个需求
- 可扩展性:支持分布式部署,具备良好的扩展性,能支持的组件越多越好,至少在接下来几年内能处理服务和集群的规模
- 数据的快速分析:追踪数据生成后的数据分析要快,分析维度尽可能多,理想情况下是一分钟内,数据的新鲜度能快速对生产异常做出反应。
4.功能模块
生产环境的链路追踪系统,主要分为4个大模块:
4.1 埋点与生成日志
分客户端埋点、服务端埋点、以及客户端和服务端双向埋点,埋点日志通常包含了traceId、spanId、调用的开始时间,协议类型、调用方ip和端口,请求的服务名、调用耗时,调用结果,异常信息等
需要写log,高并发服务中,性能影响越重,通常使用采样+异步log的方式解决
4.2 收集和存储日志
特点是需支持分布式日志采集方案,一般还会用MQ作为缓冲
每个机器上有个daemon,这里的daemon指的后台服务进程,专门用于日志收集和Trace转发;
多级collector,类似pub/sub架构,可以负载均衡;
聚合数据进行实时分析和离线存储;
离线分析 需将同一条调用链的日志汇总在一起;
4.3 分析和统计调用链数据
调用链跟踪分析:把同一TraceID的Span收集起来,按时间排序就是timeline。把ParentID串起来就是调用栈。
4.4数据展现以及决策支持
5.数据收集的三种实现方式
不论是狭义还是广义的链路追踪系统,都必须包含数据收集的工作,介绍三种主流的数据收集方式:
5.1基于日志的追踪Log-based Tracing
思路是将 Trace、Span 等信息直接输出到应用日志中,然后将日志归集过程汇聚到一起,再从全局日志信息中反推出完整的调用链拓扑关系;
日志追踪对网络消息完全没有侵入性,对应用程序只有很少量的侵入性,对性能的影响也非常低
缺点:
- 依赖日志归集过程,日志不求决对的一致和连续,精准性较低。
- 业务服务的调度和日志归集不是由同一个进程同时完成的,存在日志延迟或丢失的问题,从而产生追踪失真的情况
5.2基于服务的追踪
目前最常见的追踪实现方式,如Zipkin、SkyWalking、Pinpoint 等主流追踪系统都采用这种方式,其实现思路是:通过某些手段给目标应用注入追踪探针(Probe),比如针对 Java 应用,一般就是通过 Java Agent 注入的。
探针可以看作是目标服务身上的小型微服务系统,有服务注册、心跳检测等功能,有专门的数据收集协议,可以把从目标系统收集的服务调用信息,通过HTTP 或者 RPC 请求,发送给追踪系统
该方式具备追踪的精确性和稳定性,缺点是消耗的资源更多,具备更强的侵入性
下图是pinpoint的调用栈示例:
Pinpoint 本身就是比较重负载的系统(运行它必须先维护一套 HBase),服务追踪这方面国产开源的Skywalking更加轻量化
5.3基于边车代理的追踪
·基于边车代理的追踪是服务网格的专属方案,也是最理想的分布式追踪模型,对应用完全透明,无论是日志还是服务本身,都不会有任何变化;
边车代理本身对应用透明的工作原理,决定了它只能实现服务调用层面的追踪,像前面 Pinpoint 截图那样的本地方法调用级别的追踪诊断,边车代理是做不到的。
6.链路追踪协议
链路追踪协议的发展历史,2016 年 11 月,CNCF 技术委员会接受了 OpenTracing 作为基金会的第三个项目。OpenTracing 是一套与平台无关、与厂商无关、与语言无关的追踪协议规范。
但是,Google 却在这个时候出来并提出了与 OpenTracing 目标类似的 OpenCensus 规范,且得到了巨头 Microsoft 的支持,这样就形成了OpenTracing 和 OpenCensus两大可观测性的阵营。
2019 年,OpenTracing 和 OpenCensus 宣布握手言和,共同发布了可观测性的终极解决方案OpenTelemetry,并宣布会各自冻结 OpenTracing 和 OpenCensus 的发展。
6.1 OpenTracing
概述:OpenTracing是一个开放的API规范,旨在通过提供一套统一的接口,帮助开发人员能够在其应用中实现分布式追踪
和一般的规范标准不同,Opentracing 不是传输协议,消息格式层面上的规范标准,而是一种语言层面上的 API 标准
。以 Go 语言为例,只要某链路追踪系统实现了 Opentracing 规定的接口(interface),符合Opentracing 定义的表现行为,那么就可以说该应用符合 Opentracing 标准。
官网:https://opentracing.io/
6.2 OpenCensus
OpenCensus为微服务和单体应用提供可观测性,通过追踪请求在服务之间传播并捕获关键的时间序列指标。其核心功能是从应用程序中收集追踪和指标,能够在本地显示并将其发送到任何分析工具(也称为“后端”)
官网:https://opencensus.io/
6.3 OpenTelemetry
官网:https://opentelemetry.io/
OpenTelemetry 可以用于从应用程序收集数据。它是一组工具、API 和 SDK 集合,我们可以使用它们来检测、生成、收集和导出遥测数据(指标、日志和追踪),以帮助分析应用的性能和行为。具体的解释为:
- 一个可观测性框架和工具包,旨在创建和管理遥测数据,如追踪、指标和日志。
- 与供应商和工具无关,这意味着它可以与各种可观测性后端一起使用,包括开源工具如Jaeger和Prometheus,以及商业产品。
- 不是像Jaeger、Prometheus或其他商业供应商那样的可观测性后端。
- 专注于遥测的生成、收集、管理和导出。OpenTelemetry的一个主要目标是能够轻松地在应用程序或系统中插桩,无论它们使用何种语言、基础设施或运行时环境。遥测的数据存储和可视化故意留给其他工具。
篇幅问题就不继续详细介绍这三个协议了,感兴趣的小伙伴们可以自行去官方了解。
总结:今天讲了链路追踪的理论知识,包括:追踪与跨度的概念,一个追踪系统的模块划分,数据收集的3种方式,以及链路追踪协议的发展。了解这些概念后再更容易去理解开源的链路追踪框架。
相关文章:

分布式系统架构6:链路追踪
这是小卷对分布式系统架构学习的第6篇文章,关于链路追踪,之前写过traceId的相关内容:https://juejin.cn/post/7135611432808218661,不过之前写的太浅了,且不成系统,只是简单的理解,今天来捋一下…...

vite-plugin-imagemin安装问题
vite-plugin-imagemin 是一款图片资源压缩插件,能够在打包的时候显著的降低图片资源占用。不过,在安装过程中我们遇到了如下的问题。 对于上面的问题,有以下几种常见的解决方案: 1,使用 yarn 在 package.json 内配置(推荐) 打开 package.json 配置文件,然后添加如下脚本…...

Git revert回滚
回退中间的某次提交(此操作在预生产分支上比较常见),建议此方式使用命令进行操作(做好注释,方便后续上线可以找到这个操作) Git操作: 命令:revert -n 版本号 1:git re…...

永磁同步电机预测模型控制(MPC)
永磁同步电机预测模型控制(MPC) 文章目录 前言1、模型预测控制1.1 连续控制集模型预测控制(CCS-MPC)1.2 有限控制集模型预测控制(FCS-MPC)1.3 模型预测控制的优缺点 2、永磁同步电机模型预测控制2.1 预测模型2.2 价值…...

【JAVA】switch ... case ... 的用法
语法结构: switch(表达式){ case 值1: 表达式和值1匹配时执行的语句 break; case 值2: 表达式和值2匹配时执行的语句 break; …...

基于STM32的热带鱼缸控制系统的设计
文章目录 一、热带鱼缸控制系统1.题目要求2.思路3.电路仿真3.1 未仿真3.2 开始仿真,显示屏显示水温、浑浊度、光照强度等值3.3 当水温低于阈值,开启加热并声光报警3.4 当浑浊度高于阈值,开启自动换水并声光报警3.5 当光照低于阈值,…...

Vue项目整合与优化
前几篇文章,我们讲述了 Vue 项目构建的整体流程,从无到有的实现了单页和多页应用的功能配置,但在实现的过程中不乏一些可以整合的功能点及可行性的优化方案,就像大楼造完需要进行最后的项目验收改进一样,有待我们进一步…...

WinForm开发-自定义组件-1. 工具栏: UcompToolStrip
这里写自定义目录标题 1. 工具栏: UcompToolStrip1.1 展示效果1.2 代码UcompToolStrip.csUcompToolStrip.Designer.cs 1. 工具栏: UcompToolStrip 自定义一些Winform组件 1.1 展示效果 1)使用效果 2)控件事件 1.2 代码 设计 编码 UcompToolStrip.…...

法律专业legal case的留学论文写作技巧分析(1)
对于法律专业的留学生而言,案例的分析是写作的重要方面。无论留学的国家是英、美、澳洲还是加拿大,它们都属于case law 的法律体系。一个非常显著的特点便是通过对案例进行分析和提炼,从中总结提炼出principle和rules。case analysis的留学论…...

2025编程技术前沿:探索最新的开发工具与趋势
随着技术的飞速发展,编程领域每天都在演化,新的技术、框架和工具层出不穷。本文将聚焦2025年最具潜力和吸引力的编程技术与工具,从前沿语言到最受欢迎的开发框架,带您一起探索软件开发领域的最新趋势。 一、编程语言的新生代之星…...

sqlserver sql转HTMM邮件发送
通过sql的形式,把表内数据通过邮件的形式发送出去 declare title varchar(100) DECLARE stat_date CHAR(10),create_time datetime SET stat_dateCONVERT(char(10),GETDATE(),120) SET create_timeDATEADD(MINUTE,-20,GETDATE()) DECLARE xml NVARCHAR (max) DECLAR…...

GeoTrust True BusinessID Wildcard
GeoTrust由DigiCert 提供支持,是最受信任和尊重的品牌之一,以提供高保证的网站安全而闻名。 GeoTrust True BusinessID通配符证书 – 以低成本保护多个主机名。即使将其用于您的公司主页或电子邮件服务器主机名,保护所有敏感信息也是您的目标…...

R语言的数据结构
R语言的数据结构 R语言是专门为统计计算和数据分析而设计的一种编程语言,因其强大的数据处理能力而受到广泛欢迎。在R中,数据结构是理解和有效使用R语言的基础。本文将详细介绍R语言中的主要数据结构,包括向量、矩阵、数据框、列表、因子等&…...

安装和配置MySQL教程
以下是在不同操作系统下安装和配置MySQL的详细教程: Windows系统 下载MySQL安装包 访问MySQL官方网站(https://dev.mysql.com/downloads/mysql/),根据你的操作系统版本(32位或64位)下载相应的MySQL Commu…...

黑马Java面试教程_P10_设计模式
系列博客目录 文章目录 系列博客目录前言1. 工厂方法模式1.1 概述1.2 简单工厂模式1.2.1 结构1.2.2 实现1.2.3 优缺点 1.3 工厂方法模式1.3.1 概念1.3.2 结构1.3.3 实现1.3.4 优缺点 1.4 抽象工厂模式1.4.1 概念1.4.2 结构1.4.3 实现1.4.4 优缺点1.4.5 使用场景 总结࿰…...

043_小驰私房菜_MTK Camera,Hal层将camera型号写到property属性中
【问题背景】 app层需要知道当前设备的摄像头型号,然后做一些差异化处理。底下如何上报这个摄像头型号? 【分析】 在kernel和hal层,都是有地方能获取到当前摄像头的型号,就看在哪里添加方便。获取到摄像头硬件型号后,将其写入到property属性, 然后app就可以通过读取该…...

基础图形化界面的一个图片爬虫期末
下面是爬取界面: 点击即可自动化爬取 以下是完整代码: import tkinter as tk import requests import os #用于文件和目录操作。# 图片爬虫函数 def image_spider(textbox):headers = {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, …...
Outlook2024版如何回到经典Outlook
Outlook2024版如何回到经典Outlook 如果新加入一家公司,拿到的电脑,大概率是最新版的Windows, 一切都是新的。 如果不coding, 使用国产的foxmail大概就可以解决一切问题了。可惜老程序员很多Coding都是基于传统Outlook的,科技公司所有人都是I…...

仿生的群体智能算法总结之二(十种)
群体智能算法是一类通过模拟自然界中的群体行为来解决复杂优化问题的方法。以下是10种常见的群体智能算法,接上文https://blog.csdn.net/lzm12278828/article/details/144933367仿生的群体智能算法总结之一(十种)-CSDN博客https://blog.csdn.net/lzm12278828/article/detail…...

SpringBoot入门之创建一个Hello World项目
文章目录 一、使用传统的方式1、创建一个SpringBoot项目2、配置pom.xml文件3、下载Maven依赖4、创建一个Controller类:com.devops.controller.HelloController5、创建一个引导类:com.devops.HelloApplication6、启动项目8、访问80809、完整项目结构 二、…...

MySQL与标准SQL的区别
我们试图使MySQL Server遵循ANSI SQL标准和ODBC SQL标准,但MySQL Server在某些情况下执行不同的操作: MySQL和标准SQL特权系统之间有一些区别。例如,在MySQL中,删除表时不会自动撤销表的特权。您必须显式发出REVOKE来撤销表的特权…...

docker中使用Dockerfile设置Volume挂载点
关于在docker中如何使用Volume,可以参考文章: docker中使用Volume完成数据共享-CSDN博客 如果想在生成docker镜像的时候设置好挂载点,而不是在运行镜像生成容器时生成。 下面以自建一个tomcat镜像为例,演示如何在生成镜像时设置…...

Samsung手机首次主要采用竞对Micron LPDDR5内存
根据韩国媒体《韩国先驱报》(The Korea Herald)的报道,即将在1月底发布的三星 Galaxy S25 系列智能手机将首次主要使用美光科技(Micron Technology)提供的移动DRAM,而非三星自家的产品。这一消息对于三星的…...

【项目开发】C#环境配置及VScode运行C#教程(学生管理系统)
原创文章,禁止转载。 文章目录 下载.NETVScode配置运行程序下载.NET 官网链接: https://dotnet.microsoft.com/en-us/download选择任意版本下载: 下载完成后,双击运行exe文件,等待安装完成。 在控制台输入: dotnet --version若出现版本信息,说明安装成功: VScode配…...

[241231] CachyOS 2024 年终总结:性能飞跃与社区繁荣 | ScyllaDB 宣布转向开源可用许可证
目录 CachyOS 2024 年终总结:性能飞跃与社区繁荣ScyllaDB 宣布转向开源可用许可证 CachyOS 2024 年终总结:性能飞跃与社区繁荣 CachyOS 2024 年的最后一个版本 (也是第 13 个版本) 已经发布,同时也迎来了辞旧迎新之际。让我们一起回顾 Cachy…...

AI-Talk开发板之超拟人
一、说明 运行duomotai_ap sdk下的LLM_chat例程,实现开发板和超拟人大模型进行语音交互,支持单轮和多轮交互。 二、SDK更新 v2.3.0及以上的SDK版本才支持超拟人,如果当前SDK在v2.3.o以下,需要更新SDK。在SDK目录(duomotai_ap)下…...

Swift Concurrency(并发)学习
Swift 的并发模型是基于 异步任务 和 任务调度 的一套现代化的异步编程工具。以下是相关语法规则总结 1. 异步函数(async)与 await async 用于声明一个异步函数,表示函数可能会执行耗时任务,例如网络请求、文件读写等。在调用异步…...

从0开始的opencv之旅(1)cv::Mat的使用
目录 Mat 存储方法 创建一个指定像素方式的图像。 尽管我们完全可以把cv::Mat当作一个黑盒,但是笔者的建议是仍然要深入理解和学习cv::Mat自身的构造逻辑和存储原理,这样在查找问题,或者是遇到一些奇奇怪怪的图像显示问题的时候能够快速的想…...

Hoverfly 任意文件读取漏洞(CVE-2024-45388)
漏洞简介 Hoverfly 是一个为开发人员和测试人员提供的轻量级服务虚拟化/API模拟/API模拟工具。其 /api/v2/simulation 的 POST 处理程序允许用户从用户指定的文件内容中创建新的模拟视图。然而,这一功能可能被攻击者利用来读取 Hoverfly 服务器上的任意文件。尽管…...

详解网络管理
网络管理是指对计算机网络资源、设备和服务的有效配置、监控、管理和优化的过程。它的目的是确保网络的高效、可靠和安全运行。网络管理的关键任务包括网络监控、配置管理、性能管理、安全管理、故障管理和计费管理。下面是详细的讲解: 1. 网络管理的目标 高可用性…...