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

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...