分布式追踪中Span抽象的局限性与新解决方案探索
1. 引言
在分布式系统中,追踪请求的执行路径和性能是一项关键任务。传统的基于Span的树状追踪方法在很多场景下表现出色,但在面对一些复杂情况时,其局限性也逐渐显现。本文将深入探讨这些局限性,并介绍一些正在出现的新抽象和解决方案。
2. 树状追踪的不足
2.1 图结构而非树结构
在分布式系统中,当端到端的追踪呈现为图结构而非树结构时,传统的树状追踪方法就会遇到问题。例如,当多个RPC请求被批量合并为一个后续的RPC请求时,就会出现子Span有多个父Span的情况。
以下是一个简单的示例,展示了RPC批量处理如何导致Span图的形成:
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
X -->|RPC| A
Y -->|RPC| A
Z -->|RPC| A
A -->|Batch RPC| B
在这个示例中,多个传入服务A的请求被合并为一个批量请求,然后发送到服务B。此时,代表从A到B调用的Span的父Span难以确定。
为了解决这个问题,一种常见的方法是选择批量中第一个或最后一个请求作为父请求。但这种折中的树结构并不能正确表示真实的依赖关系,并且批量处理引入的延迟也难以准确记录。
2.2 请求间依赖
当多个追踪之间存在依赖关系时,传统的树状追