知识卡片
Dapper的Trace与Span概念及追踪系统面临的四项非功能挑战
内容
现代分布式链路追踪公认起源于Google 2010年的Dapper论文,提出了两个核心 概念:Trace(一次追踪)是从客户端请求进入系统边界到响应返回为止的整个 过程;Span(跨度)是每次调用服务前埋入的一条调用记录,要足够简单(能 塞进日志或网络协议报文头)又要足够完备(至少含时间戳、起止时间、Trace ID、当前Span ID、父Span ID)。一次Trace实际上由若干个有顺序、有层级 关系的Span组成一棵”追踪树”,把这棵树按时间和响应结果可视化,就能画出 服务调用拓扑图,据此定位缓慢或出错的服务、对比历史数据分析性能趋势。 实现追踪系统面临的挑战分两类:功能性挑战来自服务异构(不同语言、不同 网络协议每多兼容一种就多一份工作量);非功能性挑战有四项——低性能损耗 (追踪本身要用在性能敏感场景,绝不能给被追踪的服务本身添太多负担,这是 个自相矛盾但必须解决的约束);对应用透明(追踪通常是运维期才加入的, 应尽量不侵入或少侵入开发过程);随应用扩缩(集群自动扩缩时追踪系统要 能自动跟上,不需要人工介入);持续监控(必须7×24小时工作,否则抓不到 系统偶发抖动)。这四项挑战决定了不同追踪数据收集方式在实践中会有明显 的取舍差异。
结构图:
flowchart TD
A[Trace: 一次完整请求处理过程] --> B[由若干Span组成的追踪树]
B --> B1[Span1: 含TraceID/SpanID/父SpanID/起止时间]
B1 --> B2[子Span2]
B1 --> B3[子Span3]
B --> C[可视化为服务调用拓扑图]
C --> D[定位缓慢/出错服务, 性能趋势分析]
参考来源
- 位置:《凤凰架构:构建可靠的大型分布式系统》第10章"可观测性"10.2.1节
"追踪与跨度"(源文件:_epub-src对应OEBPS/Text/chapter119.xhtml)
- 结论依据:原文定义Trace和Span的构成要素及其树形层级关系,并列举低
性能损耗、对应用透明、随应用扩缩、持续的监控四项非功能性挑战,直接
支撑本卡片的结构梳理。
- 原始内容:这整个过程就称为一次"追踪"……这个记录称为一个"跨度"
(Span)……每一次Trace实际上都是由若干个有顺序、有层级关系的Span所
组成的一棵"追踪树"……低性能损耗……对应用透明……随应用扩缩……持续的
监控。