小麦带你学架构九

简介: 架构学习

调用链

微服务是一个分布式非常复杂系统,如果没有一套调用链监控,如果服务之间依赖出现问题就很难进行调位。

目前个大主流互联网公司中,ali有非常出现的鹰眼系统,点评也有一套很出名的调用链监控系统CAT。调用链监控其实最早是google提出来的,2010年google发表了一篇调用链的论文,论文以它内部的调用链系统dapper命名,这个论文中讲解调用链在google使用的经验和原理,大致的原理如下图:

在外界对微服务进行一个请求开始进入我们的微服务体系时,会生成一个Root Span,当web服务去调用后面的服务svc1时又会生成一个span,调用DB也会生成一个span,每一个应用调度都会生成一个新的span,这个是span是整个调用链形成的关键,span中有一些关键的信息,有traceId,spanId。RootSpan是比较特殊的,在启动的时候会生成spanId还会生成TraceId,其他的span会生成自己的spanId,为了维护好调用链上下文的调用关系,span会去记录调用它的链路,以parent spanId记录下来,这样的话父子之间的关系就可以记录下来,每个调用都会把第一个链路traceId也记录下来,这样,当我们把这些span都存在起来,就可以通过分析手段,把整个调用链的关系还原出来。

这里可以采用ELK的方式去记录和展示调用链监控日志,当我们一条调用为一行记录存储下来:

通过traceId 和 parentSpanId 就可以串联起来为一个整体的链路,并可以从这个链路去分析错误或者调用延时和调用次数等等。

目前市面主流的调用链选型有 zipkin,pinpoint,cat,skywalking,他们之间各有一些偏重点,值得一说的是skywalking国人出品的一款新的调用链工具,采用开源的基于字节码注入的调用链分析,接入段无代码入侵,而且开源支持多种插件,UI在几款工具来说比较功能比较强大,而且ui也比较赏心悦目,目前已经加入了apache孵化器。

skywalking优势

  • 首先在实现方式上,skywalking基本对于代码做到了无入侵,采用java探针和字节码增强的方式,而在cat还采用了代码埋点,而zipkin采用了拦截请求,pinpoint也是使用java探针和字节码增强
  • 其次在分析的颗粒度上,skywaling是方法级,而zipkin是接口级,其他两款也是方法级
  • 在数据存储上,skywalking可以采用日志体系中比较出名的ES,其他几款,zipkin也可以使用ES,pinpoint使用Hbase,cat使用mysql或HDFS,相对复杂,如果公司对ES熟悉的人才比较有保证,选择熟悉存储方案也是考虑技术选型的重点
  • 还有就是性能影响,根据网上的一些性能报告,虽然未必百分百准备,但也具备参考价值,skywalking的探针对吞吐量的影响在4者中间是最效的,经过对skywalking的一些压测也大致证明

下面是网上摘录的几款调用链选型对比:

基本原理

类别 Zipkin Pinpoint SkyWalking CAT
实现方式 拦截请求,发送(HTTP,mq)数据至zipkin服务 java探针,字节码增强 java探针,字节码增强

接入

类别 Zipkin Pinpoint SkyWalking CAT
接入方式」 基于linkerd或者sleuth方式,引入配置即可 javaagent字节码」 javaagent字节码 代码侵入
agent到collector的协议 http,MQ thrift gRPC http/tcp
OpenTracing × ×

分析

类别 Zipkin Pinpoint SkyWalking CAT
颗粒度 接口级 方法级 方法级 代码级
全局调用统计 ×
traceid查询 × ×
报警 ×
JVM监控 × ×

页面UI展示

类别 Zipkin Pinpoint SkyWalking CAT
健壮度 ** ***** **** *****

数据存储

类别 Zipkin Pinpoint SkyWalking CAT
数据存储 ES,mysql,Cassandra,内存 Hbase ES,H2 mysql,hdfs
相关文章
|
11月前
|
编解码 自然语言处理 算法
利用 PRIMO 重构 M87 黑洞图像,普林斯顿高等研究院成功将「甜甜圈」变身「金戒指」
利用 PRIMO 重构 M87 黑洞图像,普林斯顿高等研究院成功将「甜甜圈」变身「金戒指」
100 0
|
存储 运维 资源调度
|
前端开发 应用服务中间件
|
SQL 消息中间件 缓存
|
缓存 运维 监控
|
SQL 前端开发 语音技术
|
消息中间件 设计模式 自然语言处理
|
域名解析 运维 自然语言处理
|
存储 移动开发 运维