当前位置: 首页 > 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;积分&…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...