戳蓝字「前端技术优选」关注我们哦!
编者:本文讲述了Node应用的基建组件:分布式链路跟踪系统。
本文主要是讲述 Why, What,正在写下一篇: How。
你的Node应用,对接分布式链路跟踪系统了吗?
一、现状
1.1 背景
随着互联网架构的扩张,我们从传统的单体应用演进到今天日趋复杂的分布式系统。
如下图:
一个请求,最终到后端服务器内部,就会变成一个非常复杂的调用过程。
1.2 问题
当线上出现问题了,我们如何去排查问题原因?
传统的方式,我们的用户反馈了问题,前端查看是什么接口报错了,接着会跟后端说,你的接口报错了,后端会去通过日志和代码,查看问题的原因。如果后端是因为它服务的依赖方出的问题,这时候又会反馈给另外一个后端,依次定位,直到解决这个问题。
传统模式的特点:
-
低效
-
会遗漏,需要通过用户反馈给我们
-
依赖链路的复杂性,如果有100个后端,那怎么定位….
1.3 思考
既然传统模式无法解决这个问题,那我们应该如何高效的解决这个问题呢?难道,你的Node程序程序的下游出了问题,你每次都要陪跑定位问题吗?
二、介绍
为了解决这种问题,我们就需要来了解这个Node以及其他语言都会对接的这个基建:《分布式链路跟踪系统》。
2.1 什么是分布式链路跟踪系统?
分布式链路跟踪系统,他能将一次次分布式请求还原成调用链路,显式地在平台上查看一次分布式请求的调用情况,例如各个节点的耗时,请求具体打到了哪台机器、每个服务节点的请求状态等等。
功能一:
功能二:
除了将服务端里面,各个服务节点显式出来,链路跟踪系统还会提供应用拓扑图的查看功能。
例如Node程序A,依赖了后端Java程序B,然后后端Java程序又依赖另外一个服务。
例如简单的应用拓扑图:
功能三:
一些分布式链路系统,还提供了SQL性能分析的功能。
2.2 能用它做什么?
错误链路的排查:
通过在分布式链路跟踪平台,我们可以查看含有错误的链路,比如我们看到/user/getUserInfo.do接口报错的原因是因为,数据库Mysql挂掉了。这时候立马就去看看为什么Mysql挂了,是不是Mysql的机器没有磁盘空间了?
慢链路的排查:
通过在分布式链路跟踪平台,我们可以检索耗时严重的点,这时候我们就会分析,是我们的系统里面由于这块代码写的有问题呢?还是服务器不够导致这块服务A的响应不过来导致。
唯有知道了整体分布式链路里面慢的原因,我们才能去优化和改进我们的整体链路,例如整体电商购买的链路耗时很少。
三、分布式链路的理论
3.1 历史
其实Tracing,链路跟踪是在90年代就出现的技术。
但真正让这个领域流行,还是源于Google Dapper,《大规模分布式系统的跟踪系统》。中文论文的翻译地址: https://bigbully.github.io/Dapper-translation/
除了上面这篇论文以外,还有一篇关于采样这块的文章。《Uncertainty in Aggregate Estimates from Sampled Distributed Traces》
3.2 发展
有了理论基础,一批优秀的Tracing软件诞生,比较流行的例如:
-
Zipkin(twitter)
-
Apache Skywalking
-
鹰眼(taobao)
-
Jaeger
-
等等
3.3 核心步骤
我们做分布式链路跟踪,大概分为三步:
-
代码埋点
-
数据存储
-
查询展示
3.4 初始的现状
由于链路系统都是根据上面两篇论文开发,每个开发的理解都不一样,所以不同链路跟踪系统开发出来之后,相互的API并不兼容。这就导致我们如果想要切换追踪系统,往往就会带来较大的改动。
那么是不是缺一个规范呢?
3.5 标准的诞生
为了解决不同的分布式链路系统API不兼容的问题,诞生了OpenTracing规范。
OpenTracing是一个轻量级的标准化层,它位于应用程序/类库和 链路跟踪系统之间的一层。
标准有哪些优势?
-
统一了API,使开发人员能够方便的添加追踪系统的实现。
-
OpenTracing已进入CNCF,正在为全球的分布式链路跟踪系统,提供统一的模型和数据标准。
OpenTracing的数据模型:
总体相当于是一个Trace,然后Trace由Span构成。
需要说明,一个Trace并不是树形结构,他是一个有向无环图(DAG图),因为服务A依赖B,B也可以依赖A,然后Span和Span的关系叫References。
举个例子:
为了更好的展示,分布式链路跟踪系统用时间轴的方式展示:
Span含有哪些信息?
关于OpenTracing的更多信息,可以查看下面地址
总结
用OpenTracing实现的分布式链路跟踪系统的,有Jaeger、SkyWalking、Zipkin。
关于还有那些支持,我们可以查看OpenTracing官网: https://opentracing.io/docs/supported-tracers/
关于下一节,我们将以实战来讲解Node应用如何去对接分布式链路跟踪系统。下一次出现问题的时候,再也不用用传统的方式去定位问题了。
相信,你越是这样的时间节约下来,你就能花这部分知识,去学习更多有用的技术,依次反复,你就能成为大牛了。
下一篇写了一半了,实战搭建一个分布式链路跟踪系统,然后分享如何用Node程序接入这样的分布式链路系统。