-
为什么需要链路追踪?
随着互联网业务快速扩展,软件架构也日益变得复杂,为了适应海量用户高并发请求,系统中越来越多的组件开始走向分布式化,如单体架构拆分为微服务、服务内缓存变为分布式缓存、服务组件通信变为分布式消息,这些组件共同构成了复杂的分布式网络。
就目前我们国际化的项目来说,目前就三个系统分为订单系统、商户系统、支付系统。如果用户通过浏览器进行下单,结果系统给用户提示:系统内部错误,估计用户是很崩溃的。然后运营人员又将问题抛给开发人员,开发人员只知道有异常,但异常由哪个服务引起的就需要开发人员借助业务日志逐个进行排查,效率不是很高。
那有没有更好的解决方案呢?那就是全链路追踪。
-
什么是链路追踪?
链路追踪其实简单来说,就是发起一次请求执行的全过程。链路追踪就是将一次分布式请求还原成调用链路,将一次分布式请求的调用情况集中展示,比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。
- 链路跟踪主要功能:
-
- 故障快速定位:可以通过调用链结合业务日志快速定位错误信息。
- 链路性能可视化:各个阶段链路耗时、服务依赖关系可以通过可视化界面展现出来。
- 链路分析:通过分析链路耗时、服务依赖关系可以得到用户的行为路径,汇总分析应用在很多业务场景。
-
链路追踪基本原理?
- 链路追踪系统最早是由Goggle公开发布的一篇论文《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》被大家广泛熟悉,主要讲述了Dapper链路追踪系统的基本原理和关键技术点。在链路追踪中有几个比较重要的概念。
-
-
Trace
-
- Trace: 就是链路。对应的就是一个完整的链路。本身就是一个树形结构。
- 图中一条完整的链路是:用户 -> 服务A -> 服务B -> 服务C -> 服务D -> 服务C -> 服务A -> 用户。服务间经过的局部链路构成了一条完整的链路,其中每一条局部链路都用一个全局唯一的traceid来标识。
-
-
Span
-
- 在上图中可以看出来请求经过了服务A,同时服务A又调用了服务B和服务C,但是先调的服务B还是服务C呢?
- 为了表达这种父子关系引入了Span的概念。
- 同一层级parent id相同,span id不同,span id从小到大表示请求的顺序,从下图中可以很明显看出服务A是先调了服务B然后再调用了C。
- 上下层级代表调用关系,如下图服务C的span id为2,服务D的parent id为2,这就表示服务C和服务D形成了父子关系,很明显是服务C调用了服务D。
-
业界常用链路追踪系统
下面对比一下几个开源组件,方便日后大家做技术选型。
-
Skywalking
-
什么是 Skywalking
SkyWalking 是 Apache 开源的一个应用程序性能监控 (APM, Application Performance Monitoring) 系统,专门为云原生和基于容器的分布式系统设计的,提供服务和云原生基础设施信息的收集、分析、聚合以及可视化数据的展示。是一个目前比较主流的一个的性能监控软件。SkyWalking 为观察和监控分布式系统提供了一套完整的解决方案。
-
Skywalking 架构
任何一个的监控系统都可以分为以下四步:数据上报;数据分析;数据存储;数据展示;
SkyWalking 逻辑分为四部分:探针、平台后端、存储和用户界面。
- 探针 基于不同的来源数据可能是不一样, 但作用都是收集数据, 将数据格式化为 SkyWalking 适用的格式.
- 平台后端 支持数据聚合, 数据分析以及驱动数据流从探针到用户界面的流程。分析包括 Skywalking 原生追踪和性能指标以及第三方来源,包括 Istio 及 Envoy telemetry , Zipkin 追踪格式化等。 你甚至可以使用 Observability Analysis Language 对原生度量指标 和 用于扩展度量的计量系统 自定义聚合分析。
- 存储 通过开放的插件化的接口存放 SkyWalking 数据. 你可以选择一个既有的存储系统。
- UI 一个基于接口高度定制化的Web系统,用户可以可视化查看和管理 SkyWalking 数据。
-
-
参考资料
-
SkyWalking 文档:skywalking.apache.org/docs/main/l…
-
SkyWalking GitHub:github.com/apache/skyw…
-
SkyWalking go2sky GitHub:github.com/SkyAPM/go2s…