0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

链路追踪系统SkyWalking的原理

jf_ro2CN3Fa 来源:头条 2023-01-17 11:00 次阅读

什么是链路追踪?

链路追踪的原理

链路追踪系统SkyWalking的原理

SkyWalking 的基础架构

SkyWalking 的性能如何

在分布式系统,尤其是微服务系统中,一次外部请求往往需要内部多个模块,多个中间件,多台机器的相互调用才能完成。在这一系列的调用中,可能有些是串行的,而有些是并行的。在这种情况下,我们如何才能确定这整个请求调用了哪些应用?哪些模块?哪些节点?以及它们的先后顺序和各部分的性能如何呢?

这就是涉及到链路追踪。

什么是链路追踪?

链路追踪是分布式系统下的一个概念,它的目的就是要解决上面所提出的问题,也就是将一次分布式请求还原成调用链路,将一次分布式请求的调用情况集中展示,比如,各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

链路追踪的原理

衡量一个接口,我们一般会看三个指标:

1、接口的 RT(Route-Target)你怎么知道?2、接口是否有异常响应?3、接口请求慢在哪里?

1、单体架构时代

在创业初期,我们的系统一般是单体架构,如下:

d2fe7e8a-93ca-11ed-bfe3-dac502259ad0.png

对于单体架构,我们可以使用 AOP(切面编程)来统计这三个指标,如下:

d319ff5c-93ca-11ed-bfe3-dac502259ad0.png

使用 AOP(切面编程),对原本的逻辑代码侵入更少,我们只需要在调用具体的业务逻辑前后分别打印一下时间即可计算出整体的调用时间。另外,使用 AOP(切面编程)来捕获异常也可知道是哪里的调用导致的异常。

2、微服务架构

随着业务的快速发展,单体架构越来越不能满足需要,我们的系统慢慢会朝微服务架构发展,如下:

d34ff6ac-93ca-11ed-bfe3-dac502259ad0.png

在微服务架构下,当有用户反馈某个页面很慢时,虽然我们知道这个请求可能的调用链是 A -----> C -----> B -----> D,但服务这么多,而且每个服务都有好几台机器,怎么知道问题具体出在哪个服务?哪台机器呢?

d37c5f80-93ca-11ed-bfe3-dac502259ad0.png

这也是微服务这种架构下的几个痛点:

1、排查问题难度大,周期长2、特定场景难复现3、系统性能瓶颈分析较难

分布式调用链就是为了解决以上几个问题而生,它主要的作用如下:

1、自动采取数据2、分析数据,产生完整调用链:有了请求的完整调用链,问题有很大概率可复现3、数据可视化:每个组件的性能可视化,能帮助我们很好地定位系统的瓶颈,及时找出问题所在

通过分布式追踪系统,我们能很好地定位请求的每条具体请求链路,从而轻易地实现请求链路追踪,进而定位和分析每个模块的性能瓶颈。

d3992548-93ca-11ed-bfe3-dac502259ad0.png

3、分布式调用链标准(OpenTracing)

OpenTracing 是一个轻量级的标准化层,它位于应用程序/类库和追踪或日志分析程序之间。它的出现是为了解决不同的分布式追踪系统 API 不兼容的问题。

d3b53f76-93ca-11ed-bfe3-dac502259ad0.png

OpenTracing 通过提供与平台和厂商无关的 API,使得开发人员能够方便地添加追踪系统,就像单体架构下的AOP(切面编程)一样。

说到这里,大家是否想过 Java 中类似的实现?还记得 JDBC 吧?JDBC 就是通过提供一套标准的接口让各个厂商去实现,程序员即可面对接口编程,不用关心具体的实现。这里的接口其实就是标准。所以,制定一套标准非常重要,可以实现组件的可插拔。

d3d282ac-93ca-11ed-bfe3-dac502259ad0.png

OpenTracing 的数据模型,主要有以下三个:

Trace:一个完整请求链路

Span:一次调用过程(需要有开始时间和结束时间)

SpanContext:Trace 的全局上下文信息,如里面有traceId

为了让大家更好地理解这三个概念,我特意画了一张图:

d41739ba-93ca-11ed-bfe3-dac502259ad0.png

如图所示,一次下单的完整请求就是一个 Trace。TraceId是这个请求的全局标识。内部的每一次调用就称为一个 Span,每个 Span 都要带上全局的 TraceId,这样才可把全局 TraceId 与每个调用关联起来。这个 TraceId 是通过 SpanContext 传输的,既然要传输,显然都要遵循协议来调用。如图所示,如果我们把传输协议比作车,把 SpanContext 比作货,把 Span 比作路应该会更好理解一些。

理解了这三个概念,接下来我们就看看分布式追踪系统是如何采集图中的微服务调用链。

d45a0dc6-93ca-11ed-bfe3-dac502259ad0.png

我们可以看到底层有一个 Collector 一直在默默无闻地收集数据,那么每一次调用 Collector 会收集哪些信息呢。

1、全局 trace_id:这是显然的,这样才能把每一个子调用与最初的请求关联起来2、span_id: 图中的 0,1,1.1,2,这样就能标识是哪一个调用3、parent_span_id:比如 b 调用 d 的 span_id 是 1.1,那么它的 parent_span_id 即为 a 调用 b 的 span_id 即 1,这样才能把两个紧邻的调用关联起来。

有了这些信息,Collector 收集的每次调用的信息如下:

d4845aa4-93ca-11ed-bfe3-dac502259ad0.png

根据这些图表信息显然可以据此来画出调用链的可视化视图如下:

d4af88dc-93ca-11ed-bfe3-dac502259ad0.png

于是一个完整的分布式追踪系统就实现了。

以上实现看起来确实简单,但有以下几个问题需要我们仔细思考一下:

1、怎么自动采集 span 数据:自动采集,对业务代码无侵入2、如何跨进程传递 context3、traceId 如何保证全局唯一4、请求量这么多采集会不会影响性能

接下来,我们来看看链路追踪系统 SkyWalking 是如何解决以上四个问题的。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

链路追踪系统SkyWalking的原理

1、怎么自动采集 span 数据

SkyWalking 采用了插件化 + javaagent 的形式来实现了 span 数据的自动采集,这样可以做到对代码的无侵入性。插件化意味着可插拔,扩展性好。如下图所示:

d4c5d146-93ca-11ed-bfe3-dac502259ad0.png

2、如何跨进程传递 context

我们知道数据一般分为 header 和 body,就像 http 有 header 和 body,RocketMQ 也有 MessageHeader,Message Body。body 一般放着业务数据,所以不宜在 body 中传递 context,应该在 header 中传递 context,如图所示:

d4eb8d6e-93ca-11ed-bfe3-dac502259ad0.png

dubbo 中的 attachment 就相当于 header,所以我们把 context 放在 attachment 中,这样就解决了 context 的传递问题。

d5146982-93ca-11ed-bfe3-dac502259ad0.png

d5363ab2-93ca-11ed-bfe3-dac502259ad0.png

3、traceId 如何保证全局唯一

要保证全局唯一 ,我们可以采用分布式或者本地生成的 ID。使用分布式的话,需要有一个发号器,每次请求都要先请求一下发号器,会有一次网络调用的开销。所以 SkyWalking 最终采用了本地生成 ID 的方式,它采用了大名鼎鼎的 snowflow 算法,性能很高。

d55dd7fc-93ca-11ed-bfe3-dac502259ad0.png

不过 snowflake 算法有一个众所周知的问题:时间回拨,这个问题可能会导致生成的 id 重复。那么 SkyWalking 是如何解决时间回拨问题的呢。

d580861c-93ca-11ed-bfe3-dac502259ad0.png

每生成一个 id,都会记录一下生成 id 的时间(lastTimestamp),如果发现当前时间比上一次生成 id 的时间(lastTimestamp)还小,那说明发生了时间回拨,此时会生成一个随机数来作为 traceId。这里可能就有同学要较真了,可能会觉得生成的这个随机数也会和已生成的全局 id 重复,是否再加一层校验会好点。

这里要说一下系统设计上的方案取舍问题了,首先如果针对产生的这个随机数作唯一性校验无疑会多一层调用,会有一定的性能损耗,但其实时间回拨发生的概率很小(发生之后由于机器时间紊乱,业务会受到很大影响,所以机器时间的调整必然要慎之又慎),再加上生成的随机数重合的概率也很小,综合考虑这里确实没有必要再加一层全局唯一性校验。对于技术方案的选型,一定要避免过度设计,过犹不及。

4、请求量这么多,全部采集会不会影响性能?

如果对每个请求调用都采集,那毫无疑问数据量会非常大,但反过来想一下,是否真的有必要对每个请求都采集呢?其实没有必要,我们可以设置采样频率,只采样部分数据,SkyWalking 默认设置了 3 秒采样 3 次,其余请求不采样,如图所示:

d5146982-93ca-11ed-bfe3-dac502259ad0.png

这样的采样频率其实足够我们分析组件的性能了,按 3 秒采样 3 次,这样的频率来采样数据会有啥问题呢。理想情况下,每个服务调用都在同一个时间点,这样的话每次都在同一时间点采样确实没问题。如下图所示:

d608455c-93ca-11ed-bfe3-dac502259ad0.png

但在生产上,每次服务调用基本不可能都在同一时间点调用,因为期间有网络调用延时等,实际调用情况很可能是下图这样:

d6386d0e-93ca-11ed-bfe3-dac502259ad0.png

这样的话就会导致某些调用在服务 A 上被采样了,在服务 B,C 上不被采样,也就没法分析调用链的性能。

那么 SkyWalking 是如何解决的呢?

它是这样解决的:如果上游有携带 Context 过来(说明上游采样了),则下游将强制采集数据,这样可以保证链路完整。

SkyWalking 的基础架构

SkyWalking 的基础如下架构,可以说几乎所有的的分布式调用都是由以下几个组件组成的。

d6593548-93ca-11ed-bfe3-dac502259ad0.png

首先当然是节点数据的定时采样,采样后将数据定时上报,将其存储到 ES, MySQL 等持久化层,有了数据自然而然可根据数据做可视化分析。

SkyWalking 的性能如何

如下是官方的测评数据:

d6d55808-93ca-11ed-bfe3-dac502259ad0.png

图中蓝色代表未使用 SkyWalking 的表现,橙色代表使用了 SkyWalking 的表现,以上是在 TPS 为 5000 的情况下测出的数据,可以看出,不论是 CPU,内存,还是响应时间,使用 SkyWalking 带来的性能损耗几乎可以忽略不计。

接下来我们再来看 SkyWalking 与另一款业界比较知名的分布式追踪工具 Zipkin、Pinpoint 的对比(在采样率为 1 秒 1 个,线程数 500,请求总数为 5000 的情况下做的对比)。

可以看到在关键的响应时间上, Zipkin(117ms),PinPoint(201ms)远逊于 SkyWalking(22ms)!从性能损耗这个指标上看,SkyWalking 完胜!

d6f6c9b6-93ca-11ed-bfe3-dac502259ad0.png

再看下另一个指标:对代码的侵入性如何。

ZipKin 是需要在应用程序中埋点的,对代码的侵入强,而 SkyWalking 采用 javaagent + 插件化这种修改字节码的方式可以做到对代码无任何侵入。除了性能和对代码的侵入性上 SkyWaking 表现不错外,它还有以下优势几个优势:

对多语言的支持,组件丰富:目前其支持 Java、 .Net Core、PHP、NodeJS、Golang、LUA 语言,组件上也支持dubbo, mysql 等常见组件,大部分能满足我们的需求。

扩展性:对于不满足的插件,我们按照 SkyWalking 的规则手动写一个即可,新实现的插件对代码无入侵。

以上虽然主要以SkyWalking为例来介绍链路追踪系统,但是并不是说其他链路追踪系统一点不适用。具体选择什么样的,大家可按实际场景灵活选择。

编辑:何安

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 链路
    +关注

    关注

    1

    文章

    69

    浏览量

    13999
  • 分布式系统
    +关注

    关注

    0

    文章

    146

    浏览量

    19242

原文标题:什么是链路追踪?分布式系统如何实现链路追踪?

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    实时监测倒换系统

      一、概述随着通讯网络和技术的飞速发展,通信网络运营商已经从单纯注重业务的提供,转向更加注重网络可靠和业务的快速恢复,从而提高了对光传送网保护能力的要求。光实时监测倒换系统
    发表于 12-02 09:50

    基于分布式调用监控技术的全息排查功能

    ARMS控制台上配置抓取、清洗业务日志的任务,将其关联到对应的追踪系统。配置的参考示例如下:第三步,在ARMS上开启应用监控,开始全息排查。ARMS的全息排查入口和以往的应用调用
    发表于 08-07 17:02

    时钟抖动对高速性能的影响

    因为接收机锁相环路 (PLL) 追踪 f1 以下的抖动(从而排斥它),而发射 PLL 的频率上限为 f2。从接收机的角度来看,使性能降低的随机抖动降至这些限制之间。 图2高速通信
    发表于 09-19 14:23

    天线的预算

    使系统工作在最佳状态。最终也可以促使切换和呼叫建立期间,移动通话性能更好。上下行平衡的计算。对于实现双向通信的GSM系统来说,上下行
    发表于 06-12 08:27

    系统同步多通道数字怎么设计

    嗨,我有一个项目,我必须在发送器端序列化16位数字输入数据,然后在接收器端反序列化数据。这种数字的预期速度是100MHz-500MHz。这种实现必须是系统同步的,即没有任何时钟转发,我必须在Rx
    发表于 08-06 10:31

    什么是无线预算表?

    预算表用于计算Maxim工业、科学与医疗无线频段(ISM-RF)产品(Tx、Rx、TRx)的性能,估算特定的射频电路在几种环境下的通信覆盖范围和
    发表于 08-22 07:00

    监控工具Skywalking使用指南

    国产全监控工具Skywalking
    发表于 09-03 14:26

    怎么简化RF信号的分析?

    信号接收器系统的设计师常常需要进行系统性能的级联分析(从天线一直到ADC)。在分析中,噪
    发表于 10-18 07:46

    无线信道图像传输系统原理是什么?怎么实现无线的设计?

    本文考虑了系统的综合要求:系统容量、作用距离、收发时延及算法实现复杂度,采用了8倍图像压缩、RS编码加交织的方式进行了无线的设计,采用大规模FPGA完成发送端及接收端的算法实现,并
    发表于 05-31 07:00

    高速串行系统对信号的影响是什么?

    高速串行系统对信号的影响是什么?常用的补偿技术有哪些?
    发表于 06-10 06:20

    空间,空间是什么意思

    空间,空间是什么意思 卫星现有两种空间。一种是空间-地球
    发表于 04-03 11:59 1509次阅读

    聚合,聚合是什么意思

    聚合,聚合是什么意思 聚合是将两个或更多数据信道结合成一个单个的信道,该信道以一个
    发表于 04-03 14:14 2490次阅读

    PPP,什么是多PPP

    PPP,什么是多PPP PPP (点对点协议)多是根据要求分配带宽的协议,可以根
    发表于 04-03 17:31 2080次阅读

    基于磁追踪的双馈风力发电系统低电压穿越

    基于磁追踪的双馈风力发电系统低电压穿越_吴国祥
    发表于 12-28 14:24 2次下载

    Apache SkyWalking Client JS Skywalking客户端JS异常与追踪

    skywalking-client-js.zip
    发表于 04-25 10:59 0次下载
    Apache <b class='flag-5'>SkyWalking</b> Client JS <b class='flag-5'>Skywalking</b>客户端JS异常与<b class='flag-5'>追踪</b>库