当前位置: 首页 > news >正文

分布式链路追踪-03-Jaeger、Zipkin、skywalking 中的 span 是如何设计的?

开源项目

auto-log 自动日志输出

Jaeger、Zipkin 中的 spanId 是如何生成的?

在 Jaeger 和 Zipkin 这两个分布式跟踪系统中,Span ID 是通过不同的方法生成的。

下面分别介绍它们的生成方式:

  1. Jaeger 中的 Span ID 生成:

    在 Jaeger 中,Span ID 是通过 Snowflake 算法生成的。Snowflake 算法是 Twitter 开源的一种全局唯一 ID 生成算法,用于生成 64 位的唯一标识符。Jaeger 使用 Snowflake 算法生成 64 位的 Span ID,保证在整个分布式系统中每个 Span 的 ID 都是唯一的。

  2. Zipkin 中的 Span ID 生成:

    在 Zipkin 中,Span ID 是一个 64 位的十六进制数字,通常由随机算法生成。Zipkin 不像 Jaeger 一样使用 Snowflake 算法,而是依赖于随机数生成器来生成 Span ID。这样也可以保证在整个分布式系统中每个 Span 的 ID 都是唯一的。

skywalking 中的 spanId 是如何设计实现的?

在 SkyWalking 中,Span ID 是一种用于唯一标识分布式追踪的重要组成部分。

  1. 全局唯一标识符(UUID):SkyWalking 使用 UUID 作为 Span ID 的生成方式。UUID 是一个 128 位的全局唯一标识符,能够保证在整个分布式系统中每个 Span ID 都是唯一的。

  2. 基于 Snowflake 的 Trace ID:除了 Span ID,SkyWalking 还引入了 Trace ID 的概念。Trace ID 是用于唯一标识一个跟踪操作链的标识符。每个跟踪链都有一个 Trace ID,并且跟踪链中的所有 Span 都共享同一个 Trace ID。在 SkyWalking 中,Trace ID 通常由 Snowflake 算法生成,确保在整个分布式系统中每个 Trace ID 都是唯一的。

  3. 父子关系:SkyWalking 通过在 Span 数据中记录父 Span 的 ID,来建立 Span 之间的父子关系。这样,就可以构建完整的操作依赖关系图,帮助了解操作之间的调用链路。

为什么 skywalking 会用两种算法?直接用一种不行吗

SkyWalking 之所以采用两种算法(UUID 和 Snowflake)来生成 Span ID 和 Trace ID,是为了在不同的场景下兼顾唯一性、顺序性和性能。

  1. UUID 算法: UUID(Universally Unique Identifier)是一种标准化的全局唯一标识符,可以保证在不同的系统和环境中生成的 ID 都是唯一的。使用 UUID 算法生成 Span ID 可以确保在整个分布式系统中每个 Span 的 ID 都是唯一的,避免了冲突和数据混淆。

  2. Snowflake 算法: Snowflake 算法是一种用于生成分布式唯一 ID 的算法,通常由时间戳、机器ID和序列号组成。在 SkyWalking 中,Snowflake 算法用于生成 Trace ID,用于唯一标识一个跟踪链。通过在 Trace ID 中包含时间戳信息,可以在一定程度上保证 Trace ID 的顺序性,即在同一节点上生成的 Trace ID 是按照时间顺序递增的。

使用两种算法的组合,SkyWalking 在实现跟踪数据的唯一性和顺序性的同时,也考虑了性能的因素。

UUID 算法生成 Span ID 具有较高的唯一性,而 Snowflake 算法生成 Trace ID 具有较好的顺序性。

这样的设计使得 SkyWalking 在处理大规模分布式系统的跟踪数据时能够有较好的性能表现。

skywalking 中为什么 traceId 要按照时间递增呢?直接唯一还不够吗

在分布式系统跟踪中,Trace ID 是用于唯一标识一个跟踪操作链的标识符。Trace ID 的唯一性是必要的,以确保在分布式环境中不会出现跟踪数据的混淆和冲突。

通过唯一的 Trace ID,可以将属于同一跟踪链的所有 Span 关联在一起,形成完整的操作路径,帮助开发人员了解操作之间的依赖关系和调用链路。

而按照时间递增的设计则是为了在跟踪数据中引入一定程度的顺序性,以帮助更好地理解操作的时间顺序和执行过程。由于分布式系统中的操作可能在不同节点上同时执行,而节点之间的时钟可能存在微小的差异,导致无法完全按照生成顺序进行排序。因此,通过在 Trace ID 中包含时间戳信息,并按照时间递增的方式生成 Trace ID,可以在局部范围内近似保证顺序性。

这样的设计有助于在分析和可视化跟踪数据时,更好地还原操作的执行顺序和时间线,方便开发人员定位问题和调试分布式系统。

但需要明确的是,SkyWalking 中的 Trace ID 的时间递增并不是严格的全局顺序,而是在局部范围内近似有序。在大规模分布式系统中,完全保证全局顺序是困难的,因此对于跟踪数据的顺序性设计,需要权衡利弊并根据具体需求做出合理的决策。

spanID 为什么不使用 snowflake ,而是使用 uuid 呢

在分布式系统跟踪中,选择 Span ID 的生成方式是一个涉及多个因素的决策。

虽然 Snowflake 算法在生成分布式唯一 ID 方面效果良好,但在分布式系统跟踪中,通常会选择使用 UUID(Universally Unique Identifier)作为 Span ID 的生成方式,原因如下:

  1. 全局唯一性:UUID 是标准化的全局唯一标识符,由128位数字组成。使用 UUID 生成 Span ID 可以确保在整个分布式系统中每个 Span 的 ID 都是唯一的,避免了冲突和数据混淆。对于大规模分布式系统,全局唯一性是确保跟踪数据准确性和关联性的重要保证。

  2. 简单性和易用性:UUID 的生成过程相对简单,并且在现代编程语言和框架中都有相应的库和函数可用。使用 UUID 生成 Span ID 不需要额外的设置和复杂的算法,简化了代码的实现和维护。

  3. 随机性:UUID 是通过随机算法生成的,它不依赖于时间戳或序列号,避免了在生成过程中需要考虑时间戳的顺序性问题。这使得 Span ID 更具有随机性,有助于避免在跟踪数据中产生局部的顺序关联,从而更好地反映分布式系统的实际执行情况。

小结

希望本文对你有所帮助,如果喜欢,欢迎点赞收藏转发一波。

我是老马,期待与你的下次相遇。

相关文章:

分布式链路追踪-03-Jaeger、Zipkin、skywalking 中的 span 是如何设计的?

开源项目 auto-log 自动日志输出 Jaeger、Zipkin 中的 spanId 是如何生成的? 在 Jaeger 和 Zipkin 这两个分布式跟踪系统中,Span ID 是通过不同的方法生成的。 下面分别介绍它们的生成方式: Jaeger 中的 Span ID 生成: 在 Ja…...

【达梦数据库】获取对象DDL

目录 背景获取表的DDL其他 背景 在排查问题时总会遇到获取对象DDL的问题,因此做以下总结。 获取表的DDL 设置disql工具中显示LONG类型数据的最大长度,避免截断: SET LONG 9999获取DDL SELECT DBMS_METADATA.GET_DDL(TABLE,表名,模式名) …...

InnoDB和MyISAM引擎优缺点和区别

nnoDB和MyISAM是MySQL数据库中常用的两种存储引擎。它们各自具有不同的特性和优势,适用于不同的应用场景。 一、InnoDB引擎: 1、它有如下特性: 1)、支持事务(ACID) 2)、支持外键约束(FOREIGN KEY const…...

文件上传知识点汇总

归纳总结一下文件上传(其实是懒得写wp) 基于Dream ZHO师傅的CTF show 文件上传篇(web151-170,看这一篇就够啦)-CSDN博客 和dota_st 师傅的ctfshow-Web1000题系列修炼(一) | dota_st 做一篇自己的总结 目录 一、什么…...

计算机网络技术基础:5.数据通信系统

一、数据通信的基本概念 1.信息 信息是对客观事物的运动状态和存在形式的反映,可以是客观事实的形态、大小、结构、性能等描述,也可以是客观事物与外部之间的联系。信息的载体可以是数字、文字、语音、图形和图像等。计算机及其外围设备产生和交换的信息…...

光谱相机在农业的应用

一、作物生长监测1、营养状况评估 原理:不同的营养元素在植物体内的含量变化会导致植物叶片或其他组织的光谱反射率特性发生改变。例如,氮元素是植物叶绿素的重要组成部分,植物缺氮时,叶绿素含量下降,其在可见光波段&a…...

高考志愿填报:如何制定合理的志愿梯度?

高考志愿填报中常见的避雷行为,深入分析了专业选择、招生政策了解、学校选择、备选方案准备以及防诈骗等方面的关键问题,并提出了针对性的建议与策略。旨在为考生和家长提供实用的指导,助力考生科学合理地填报高考志愿,避免陷入各…...

Android基于Path的addRoundRect,Canvas剪切clipPath简洁的圆角矩形实现,Kotlin(1)

Android基于Path的addRoundRect&#xff0c;Canvas剪切clipPath简洁的圆角矩形实现&#xff0c;Kotlin&#xff08;1&#xff09; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res…...

webGL硬核知识:图形渲染管渲染流程,各个阶段对应的API调用方式

一、图形渲染管线基础流程概述 WebGL 的图形渲染管线大致可分为以下几个主要阶段&#xff0c;每个阶段都有其特定的任务&#xff0c;协同工作将 3D 场景中的物体最终转换为屏幕上呈现的 2D 图像&#xff1a; 顶点处理&#xff08;Vertex Processing&#xff09;阶段&#xff1…...

区块链详解

1. 概述 1.1 什么是区块链&#xff1f; 区块链是一种分布式数据库技术&#xff0c;它以链式数据结构的形式存储数据&#xff0c;每个数据块与前一个数据块相关联&#xff0c;形成了一个不断增长的数据链。每个数据块中包含了一定数量的交易信息或其他数据&#xff0c;这些数据…...

【EXCEL 逻辑函数】AND、OR、XOR、NOT、IF、IFS、IFERROR、IFNA、SWITCH

目录 AND&#xff1a;当所有条件都为真时返回 TRUE&#xff0c;否则返回 FALSE OR&#xff1a;当任一条件为真时返回 TRUE&#xff0c;否则返回 FALSE XOR&#xff1a;当奇数个条件为真时返回 TRUE&#xff0c;否则返回 FALSE NOT &#xff1a;反转逻辑值 IF&#xff1a;根…...

ubuntu下gdb调试ROS

参考&#xff1a; 使用VsCode进行ROS程序调试_ros vscode 调试-CSDN博客 https://blog.csdn.net/weixin_45031801/article/details/134399664?spm1001.2014.3001.5506 一、调试准备 1.1 CMakeLists改动 注释文件中的 set(CMAKE_BUILD_TYPE "Release") #构建类…...

Docke_常用命令详解

这篇文章分享一下笔者常用的Docker命令供各位读者参考。 为什么要用Docker? 简单来说&#xff1a;Docker通过提供轻量级、隔离且可移植的容器化环境&#xff0c;使得应用在不同平台上保持一致性、易于部署和管理&#xff0c;具体如下 环境一致性&#xff1a; Docker容器使得…...

使用vue2.0或vue3.0创建自定义组件

Vue2.0创建自定义组件 在 Vue 2.0 中创建自定义组件是一个相对简单的过程。以下是一个详细的步骤指南&#xff0c;帮助你创建一个自定义组件。 步骤 1: 创建 Vue 组件文件 首先&#xff0c;你需要创建一个新的 Vue 文件&#xff08;.vue 文件&#xff09;。假设我们要创建一…...

Elasticsearch-DSL高级查询操作

一、禁用元数据和过滤数据 1、禁用元数据_source GET product/_search {"_source": false, "query": {"match_all": {}} }查询结果不显示元数据 禁用之前: {"took" : 0,"timed_out" : false,"_shards" : {&quo…...

【Linux】重启系统后开不开机(内核模块丢失问题)

问题 重启后开不开机报错如下&#xff1a; FAILED failed to start load kernel moduiles 可以看到提示module dm_mod not found 缺少了dm_mod 在内核module目录中 reboot重启可以看到这个现象&#xff1a; 可以看到重启启动磁盘&#xff0c;加载不到root 原因 dm_mod模块…...

对golang的io型进程进行off-cpu分析

背景&#xff1a; 对于不能占满所有cpu核数的进程&#xff0c;进行on-cpu的分析是没有意义的&#xff0c;因为可能程序大部分时间都处在阻塞状态。 实验例子程序&#xff1a; 以centos8和golang1.23.3为例&#xff0c;测试下面的程序&#xff1a; pprof_netio.go package m…...

Springboot中使用Retrofit

Retrofit官网 https://square.github.io/retrofit/ 配置gradle implementation("com.squareup.okhttp3:okhttp:4.12.0")implementation ("com.squareup.retrofit2:retrofit:2.11.0")implementation ("com.squareup.retrofit2:converter-gson:2.11.0…...

Ubuntu中配置内网固定IP

文章目录 背景一、配置步骤&#xff08;一&#xff09;首先确认网卡名称&#xff08;二&#xff09;确认网关&#xff08;三&#xff09;备份配置文件&#xff08;四&#xff09;编辑配置文件&#xff08;五&#xff09;应用配置&#xff08;六&#xff09;验证配置 二、注意事…...

ExcelVBA编程输出ColorIndex与对应颜色色谱

标题 ExcelVBA编程输出ColorIndex与对应颜色色谱 正文 解决问题编程输出ColorIndex与对应色谱共56&#xff0c;打算分4纵列输出&#xff0c;标题是ColorIndex,Color,Name 1. 解释VBA中的ColorIndex属性 在VBA&#xff08;Visual Basic for Applications&#xff09;中&#xff…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...

SDU棋界精灵——硬件程序ESP32实现opus编码

一、 ​​音频处理框架​ 该项目基于Espressif的音频处理框架构建,核心组件包括 ESP-ADF 和 ESP-SR,以下是完整的音频处理框架实现细节: 1.核心组件 (1) 音频前端处理 (AFE - Audio Front-End) ​​main/components/audio_pipeline/afe_processor.c​​功能​​: 声学回声…...

rk3506上移植lvgl应用

本文档介绍如何在开发板上运行以及移植LVGL。 1. 移植准备 硬件环境:开发板及其配套屏幕 开发板镜像 主机环境:Ubuntu 22.04.5 2. LVGL启动 ​ 出厂系统默认配置了 LVGL,并且上电之后默认会启动 一个LVGL应用 。 LVGL 的启动脚本为/etc/init.d/pre_init/S00-lv_demo,…...