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

MySQL中in和exists的使用场景

在MySQL中&#xff0c;IN 和 EXISTS 是用于子查询的两种常见方法&#xff0c;它们在不同的场景下有不同的表现和适用性。下面我将详细介绍这两种方法的使用场景、优劣&#xff0c;并通过实验来说明问题。 IN 子查询 使用场景&#xff1a; 当子查询返回的结果集较小且不包含 …...

【多线程2】start 和 run 区别,终止线程,等待线程

Thread 类使用 start 方法&#xff0c;启动一个线程&#xff0c;对于同一个 Thread 对象来说&#xff0c;start 只能调用一次&#xff01;&#xff01;&#xff01; 不怕名字起的长&#xff0c;就怕含义不清楚&#xff01; 想要启动更多线程&#xff0c;就是得创建新的对象&am…...

富途证券C++面试题及参考答案

C++ 中堆和栈的区别 在 C++ 中,堆和栈是两种不同的内存区域,它们有许多区别。 从内存分配方式来看,栈是由编译器自动分配和释放的内存区域。当一个函数被调用时,函数内的局部变量、函数参数等会被压入栈中,这些变量的内存空间在函数执行结束后会自动被释放。例如,在下面的…...

Go使用sqlx操作MySQL完整指南

# Go使用sqlx操作MySQL完整指南## 1. 安装依赖bash go get github.com/go-sql-driver/mysql go get github.com/jmoiron/sqlx2. 数据库基础操作 package mainimport ("fmt"_ "github.com/go-sql-driver/mysql""github.com/jmoiron/sqlx" )// 定…...

Python 爬取网页文字并保存为 txt 文件教程

引言 在网络数据获取的过程中&#xff0c;我们常常需要从网页中提取有用的文字信息。Python 提供了强大的库来帮助我们实现这一目标。本教程将以https://theory.gmw.cn/2023 - 08/31/content_36801268.htm为例&#xff0c;介绍如何使用requests库和BeautifulSoup库爬取网页文字…...

时间序列预测论文阅读和相关代码库

时间序列预测论文阅读和相关代码库列表 MLP-based的时间序列预测资料DLinearUnetTSFPDMLPLightTS 代码库以及论文库&#xff1a;Time-Series-LibraryUnetTSFLightTS MLP-based的时间序列预测资料 我会定期把我的所有时间序列预测论文有关的资料链接全部同步到这个文章中&#…...

Mamba安装环境和使用,anaconda环境打包

什么是mamba Mamba是一个极速版本的conda&#xff0c;它是conda的C重新实现&#xff0c;使用多线程并行处理来加速包和依赖项的下载。 Mamba旨在提高安装、更新和卸载Python包的速度&#xff0c;同时保持与conda相同的兼容性和命令行接口。 Mamba的核心部分使用C实现&#xff…...

SSH连接成功,但VSCode连接不成功

环境 在实验室PC上连接服务器234 解决方案&#xff1a;在VSCode中重新添加远程主机 删除旧的VSCode Server 在远程主机上&#xff0c;VSCode会安装一个‘vscode-server’服务来支持远程开发&#xff0c;有时旧的‘vscode-server’文件可能会导致问题&#xff0c;删除旧的&am…...

springboot结合AES和国密SM4进行接口加密

api接口加密 1.为什么需要api接口加密呢&#xff1f; 1.防止爬虫 2.防止数据被串改 3.确保数据安全 2.如何实现接口加密呢&#xff1f; 3.我们可以使用哪些加密算法来加密呢&#xff1f; AES 密码学中的高级加密标准&#xff08;Advanced Encryption Standard&#xff0c;…...

iOS在项目中设置 Dev、Staging 和 Prod 三个不同的环境

在 Objective-C 项目中设置 Dev、Staging 和 Prod 三个不同的环境&#xff0c;并为每个环境使用不同的 Bundle ID&#xff0c;可以通过以下步骤实现&#xff1a; 步骤 1: 创建不同的 Build Configuration 打开项目&#xff1a; 启动 Xcode 并打开你的项目。 选择项目文件&…...