怎么理解分布式链路追踪技术?

 点击上方“分布式实验室”关注公众号

回复“1”抽取纸质技术书


 1 

为什么需要链路追踪

在学习分布式链路追踪之前,我们需要先理解这项技术产生的背景,以及它能够帮我们解决哪些棘手问题。

提到分布式链路追踪,我们要先提到微服务。相信很多人都接触过微服务,这里再回顾一下基本概念。

微服务是一种开发软件的架构和组织方法,它侧重将服务解耦,服务之间通过API通信。使应用程序更易于扩展和更快地开发,从而加速新功能上线。

47fab63658513f4b36013301edb20c79.png

微服务演变-亚马逊云

加速研发快速迭代,让微服务在业务驱动的互联网领域全面普及,独领风骚。但是,随之而来也产生了新问题:当生产系统面对高并发,或者解耦成大量微服务时,以前很容易就能实现的监控、预警、定位故障就变困难了。

我拿研发的搜索系统的经历,结合场景给大家聊聊(曾经这套系统要去抗峰值到日均10亿PV、5千万UV的高并发)。

83509b1009cce947a9d31b82c0df7c5c.png

机票搜索演示图

比如搜索机票这样一个行为,其实是对上百个查询服务器发起了一个查询,这个查询会被发送到多个微服务系统,这些微服务系统分别用来处理航班信息、查询有无舱位、机票价格、机场关键字匹配,查找图片资源等等。每个子系统的查询最终聚合得到的结果,会汇总到搜索结果页上。

用户一次查询,做了这么一个“全局搜索”。任何一个子系统变慢,都会导致最终的搜索变得慢,那用户体验就会很差了。

看到这里,你可能会想,体验差我们做搜索优化不就好了么?确实如此,但一般情况,一个前端或者后端工程师虽然知道系统查询耗时,但是他无从知晓这个问题到底是由哪个服务调用造成的,或者为什么这个调用性能差强人意。

首先,这个工程师可能无法准确定位到这次全局搜索是调用了哪些服务,因为新的服务、乃至服务上的某个功能,都有可能在任何时间上过线或修改过。其次,你不能苛求这个工程师对所有参与这次全局搜索的服务都了如指掌,每一个服务都有可能是由不同的团队开发或维护的。再次,搜索服务还同时还被其他客户端使用,比如手机端,这次全局搜索的性能问题甚至有可能是由其他应用造成的。

这是过去我的团队面临的问题,微服务让我们的工程师观察用户行为,定位服务故障很棘手。


 2 

什么是分布式链路追踪

刚才说的情况,我们迫切需要一些新工具,帮我们理解微服务分布式系统的行为、精准分析性能问题。于是,分布式系统下链路追踪技术(Distributed Tracing)出现了。

它的核心思想是:在用户一次请求服务的调⽤过程中,无论请求被分发到多少个子系统中,子系统又调用了更多的子系统,我们把系统信息和系统间调用关系都追踪记录下来。最终把数据集中起来可视化展示。它会形成一个有向图的链路,看起来像下面这样。

4ac1ab12bd339b9b7c8dd1031d34774e.png

电商系统的链路追踪图

后来,链路追踪技术相关系统慢慢成熟,涌现了像Dapper、Zipkin、HTrace、OpenTelemetry等优秀开源系统。他们也被业界,特别是互联网普遍采用。

目前Dapper(诞生于Google团队)应用影响最大,OpenTelemetry已经成为最新业界标准,我们重点基于OpenTelemetry讲解一下Trace内部结构。


 3 

链路Trace的核心结构

快速入门

我们看看一个例子,某商家给(顾客)开账单(要求付款),在系统中大体的流程:

f4ea5916839ef95a675c497108f34e6d.png

一个开账单的例子

当商家从client发起开账单服务,请求从client程序先后进行了一系列操作:

  • 网关load balancer:client的https请求先经过网关,网关调用下面的子系统

  • 身份认证auth:网关RPC请求到服务auth,auth发起身份认证,完成后通知网关程序

  • 生成账单billing:身份认证成功后,网关再发送RPC请求到服务billing,billing是生成账单的操作,billing处理完通知网关下一步

  • 资源加载resource:billing成功,网关发送一个HTTP请求到服务resource,加载和账单相关资源,比如静态图片,相关顾客资料,resource完成通知网关

  • 最后网关程序处理完开账单服务,返回结果给client

例子中,我们把开账单服务一个流程或者叫一个事务称为Trace。这里面有几个操作,分别是请求网关、身份认证、生成账单、加载资源,我们把每个操作(Operation)称为一个 Span。

Trace数据模型

我们看看Trace广义的定义:Trace是多个 Span 组成的一个有向无环图(DAG),每一个 Span 代表 Trace 中被命名并计时的连续性的执行片段。我们一般用这样数据模型描述Trace和Span关系:

[Span user click]  ←←←(the root Span)
                       |         
                 [Span gateway]  
                       |
     +------+----------+-----------------------+
     |                 |                       |
 [Span auth]      [Span billing]     [Span loading resource]

开账单Trace数据模型

数据模型包含了Span之间关系。Span定义了父级Span,子Span的概念。一个父级的Span会并行或者串行启动多个子Span。图三,Gateway就是auth、billing的父级Span。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值