📜  分布式跟踪简介(1)

📅  最后修改于: 2023-12-03 15:36:50.495000             🧑  作者: Mango

分布式跟踪简介

随着系统规模的不断扩大和服务间调用关系的复杂化,出现了一种叫做分布式跟踪(distributed tracing)的技术手段,用于帮助开发者跟踪和 debug 分布式系统中的服务调用链路和性能瓶颈。

背景

在单体应用时代,我们通常可以通过日志或者调试器等手段比较容易地排查问题,但随着应用不断扩展,变成了越来越复杂的分布式系统,问题不再是出现在应用本身,而是分散在各个服务之间的调用链路当中。

传统的单个服务的调试手段无法满足在分布式环境下定位问题的需求,因为我们需要了解请求从一个服务到另一个服务的完整路径和时间线,以及在这个过程中发生的任何问题和瓶颈。

因此,为了提供更好的问题排查和诊断支持,引入了分布式跟踪技术。

什么是分布式跟踪

分布式跟踪是将多个服务之间的跟踪信息收集起来,形成一条完整的跨服务调用链路,同时记录这些调用发生的时间、处理时间等属性信息的系统。对于系统中每一个请求,都会生成一个唯一的 Trace ID,Trace ID 贯穿整个请求链路,方便我们跟踪一个请求具体经过了哪些服务,哪些服务出了问题。

在分布式环境下,服务数量庞大,跨服务调用出现的问题可能非常复杂,跟踪作为一个监控工具,可以用来快速定位服务调用链上出现的问题,如超时、错误、慢速操作等问题。

分布式跟踪的架构

分布式跟踪通常由三部分组成:

采样器(Sampler)

为了避免对系统性能产生过大的影响,不可能对所有请求都进行跟踪。因此需要一个采样器,根据一定的采样策略抽样一部分请求进行跟踪,同时还需要控制 Trace ID 的创建和传播。

收集器(Collector)

当一个请求发生时,不同的服务在处理请求时都需要绑定 Trace ID,将跟踪信息发送到一个集中的收集器,以便跨服务调用信息的收集和存储。

前端(Frontend)

前端提供了一种便于用户查看跨服务请求链路的方式,通常包含查询、搜索、聚合等 API,用户可以使用这些 API 快速定位问题,并进行分析和排查。

常见的分布式跟踪系统

在实际应用中,常用的分布式跟踪系统有 OpenZipkin、Jaeger 和 SkyWalking 等。这些系统均提供了完整的 Trace ID 的生成和传播机制、采样和存储机制、跨服务操作的聚合和查询机制等。

如何接入分布式跟踪

现如今,很多开源项目都提供了分布式跟踪的集成,以方便开发者快速启用。例如在 Sping Cloud 的全家桶中,通过改变相应配置,就可以将 Zipkin 集成到项目中。此外,很多云厂商的解决方案中也集成了分布式跟踪,如 AWS 的 X-Ray 等。

// Zipkin接入示例
@Bean public Sampler defaultSampler() {
    return Sampler.ALWAYS_SAMPLE;
}

@Bean
public Reporter<zipkin.Span> reporter() {
    // 配置 Zipkin 地址
    return AsyncReporter.create(URLConnectionSender.create("http://localhost:9411/api/v2/spans"));
}

@Bean
public Tracing tracing(Reporter<zipkin.Span> reporter) {
    // 创建 Tracing 对象
    return Tracing.newBuilder()
                  .localServiceName("service-a")
                  .spanReporter(reporter)
                  .sampler(Sampler.create(0.1f))
                  .spanReporter(reporter)
                  .build();
}
总结

分布式跟踪技术能够帮助开发者解决分布式系统中的调用链路和性能问题,是。 然而,跟踪本身也会带来一些性能损失,因此需要开发者在采样率、跟踪级别等方面做出适当的配置和平衡。