分布式链路追踪理论

基本概念

分布式调用链标准-openTracing

Span-节点组成跟踪树结构

有一些特定的变量,SpanName SpanId traceId spanParentId

Trace(追踪) :代表一个完整的请求流程(如用户下单),由多个Span组成

Span(跨度) :请求经过的单个服务或操作(如订单服务调用支付服务)

包含:开始/结束时间、服务名、调用关系等

Context(上下文):传递Trace ID、Span ID等,确保链路连续

分布式链路追踪 = Trace ID串联全局 + Span记录局部 + 上下文传递


Span节点必须包含的内容

OperationName:操作名称

BeiginTime:开始时间

EndTime:结束时间

SpanTag:是一组键值对 构成的Span的标签集合(key必须是String类型,value可以是String,Boolean和数字类型),这个的目的是为Span添加更多的描述信息

SpanLog:一组Span的日志集合 ,是键值对,记录日志信息

SpanContext:是一个上下文对 象,会从上一个节点传递到下一个节点,里面包含了traceIdSpanIdBaggage (这是一个跨Span集合 ,上一个节点往Baggage加信息下一个节点可以拿到,不要放太多信息不然会导致占用空间大影响效率),我们通过上下文对象去进行 跨进程 传递


TraceSegment和TraceId原理

TraceSegment:

  1. 指的是一个进程中所有的Span的集合
  2. 如果多个线程协同产生同一个Trace(例如多个RPC调用不同的方法),它们只会共同创建一个TraceSegment
  3. 支持多入口,所以Skywalking去除了树节点RootSpan的概念,提出了三种Span模型

TraceId:

  1. TraceId应该是全局唯一的
  2. 我们的TraceId是根据时间错+算法生成的,所以会有时间回拨问题
  3. 我们有个变量lastTimeStamp保存上次TraceId生成的时间,然后在生成TraceId前进行比较,如果CuurentTimeMills比lastTimeStamp时间小,说明时间回拨了,我们就不生成Id,这样来保证TraceId全局唯一

概念简单总结

三个基本概念:Trace追踪,Span服务,Context上下文(用来传递信息)

分布式链路追踪 = Trace ID串联全局 + Span记录局部 + 上下文传递

Span中包含starTime,endTime,SpanContetx(上下文用来传递信息,包含TraceId,SpanId),

SpanTag(服务的标签),SpanLog(服务的日志信息)

TraceSegment(追踪段):一个进程中所有的Span的集合

TraceId:全局唯一,依赖时间戳,保存上次TraceId生成的时间,生成ID时时间戳进行对比,防止时间回拨问题


全链路追踪的工作流

阶段1:链路数据生成(埋点)

自动埋点:通过SDK或Agent自动在服务框架(如Spring Cloud、Dubbo)中注入追踪逻辑。

手动埋点:在业务代码中手动标记关键操作(如支付流程)。

示例:用户下单时,网关生成Trace ID=ABC,创建根Span(Span ID=1)


阶段2:链路数据采集与传输

采集方式 :通过Agent或Sidecar(如Envoy)实时收集Span数据

传输协议:通过gRPC、HTTP等将数据发送到Collector(如Jaeger Collector)。

示例:订单服务(Span ID=2)和库存服务(Span ID=3)的Span通过Kafka发送到收集器。


阶段3:链路数据存储

存储后端:使用时序数据库(如InfluxDB)、列式存储(如Cassandra)或Elasticsearch。

数据模型:按Trace ID聚合Span,建立索引(如服务名、耗时、错误码)。

示例:Trace ID=ABC的所有Span被存储为一条完整链路。


阶段4:数据查询与分析

可视化通过UI工具(如Zipkin、SkyWalking)展示火焰图、调用拓扑。

分析能力:支持按服务名、耗时、错误码过滤,自动统计P99延迟、错误率。

示例:发现库存服务(Span ID=3)平均耗时500ms,触发告警


流程简单总结
  1. 链路数据生成:在进入Span服务前生成数据,一般来说再进入服务器会有自定义数据处理or服务启动前的Agent增强让服务有了多余的自定义逻辑
  2. 实时采集与传输链路数据:通过Http或者grpc采集和传输链路追踪的数据
  3. 链路数据存储:存储链路追踪的数据
  4. 数据查询与分析可视化:通过可视化页面展示详细的链路追踪流程和数据,显示服务细节,耗时,错误等
相关推荐
怒放吧德德2 小时前
Netty 4.2 入门指南:从概念到第一个程序
java·后端·netty
雨中飘荡的记忆4 小时前
大流量下库存扣减的数据库瓶颈:Redis分片缓存解决方案
java·redis·后端
心之语歌6 小时前
基于注解+拦截器的API动态路由实现方案
java·后端
华仔啊8 小时前
Stream 代码越写越难看?JDFrame 让 Java 逻辑回归优雅
java·后端
ray_liang8 小时前
用六边形架构与整洁架构对比是伪命题?
java·架构
Ray Liang9 小时前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
Java水解9 小时前
Java 中间件:Dubbo 服务降级(Mock 机制)
java·后端
SimonKing13 小时前
OpenCode AI辅助编程,不一样的编程思路,不写一行代码
java·后端·程序员
FastBean14 小时前
Jackson View Extension Spring Boot Starter
java·后端
Seven9715 小时前
剑指offer-79、最⻓不含重复字符的⼦字符串
java