概述
随着分布式系统和微服务的出现,一次用户请求可能会经过多个系统,不同服务之间的交互非常复杂,任何一个系统出错都可能影响整个请求的处理结果。以往的监控系统往往只能知道单个系统的健康状况、一次请求的成功失败,无法快速定位失败的根本原因。除此之外,复杂的分布式系统也面临这下面这些问题:
- 性能分析难:一个服务依赖很多服务,被依赖的服务也依赖了其他服务。如果某个接口耗时突然变长了,那未必是直接调用的下游服务慢了,也可能是下游的下游慢了造成的,如何快速定位耗时变长的根本原因呢?
- 链路梳理难:需求迭代很快,系统之间调用关系变化频繁,靠人工很难梳理清楚系统链路拓扑。
- 容量评估难:搞促销活动时,一般需要提前扩容以应对流量暴涨,然而不同促销活动、不同的流量入口对各个系统的影响是不同的,如何准确评估某个入口流量增长对下游系统的影响呢?
为了解决这些问题,Google 推出了一个分布式链路跟踪系统 Dapper,之后各个互联网公司都参照 Dapper 的思想推出了自己的分布式链路跟踪系统。
基本原理
下面的图里展示了一次用户请求引起了若干次系统之间的 RPC 调用,在这个示例里,用户请求首先到达前端系统 A,A 又调用了中间层系统 B、C,紧接着 C 又调用了两个后端系统 D、E。分布式链路跟踪系统就是要记录这一系列 RPC 调用的基本信息:调用关系、发生的时间、异常信息以及一些流量标记等。