精准测试之分布式调用链底层逻辑

京东云开发者
• 阅读 337

作者:京东工业 宛煜昕

概要: 1. 调⽤链系统概述; 2. 调⽤链系统的演进; 3. 调⽤链的底层实现逻辑; 4. Span内容组成。

⼀、分布式调⽤链系统概述

客户打电话给客服说:“优惠券使⽤不了”。 -客服告诉运营⼈员 --运营打电话给技术负责⼈ ---技术负责⼈通知会员系统开发⼈员 ----会员找到营销系统开发⼈员 -----营销系统开发⼈员找到DBA ------DBA找到运维⼈员 -------运维⼈员找到机房负责⼈ --------机房负责⼈找到⼀只⽼⿏ ,因为就是它把⽹线咬断了。

分布式架构所带来的问题

定位⼀个问题怎么会如此复杂?竟然动⽤了公司⼀半以上的职能部⻔。但其实这只是当我系统变成分布式之后,当我们把服务进⾏细粒度的拆份之后的⼀⼩部分问题,更多问题在哪⾥?⽐如: 1. 开发成本增加。 2. 测试成本增加。 3. 产品迭代周期将变⻓。 4. 运维成本增加。

精准测试之分布式调用链底层逻辑

问题产⽣原因

在传统制造业,分⼯越精细,专业化程度越⾼,产能就越⾼。⽐如⼀台汽⻋平均将近3万个零部件,来⾃全球各个供应商,最后再由汽⻋⼚商统⼀拼装检测出⼚。不仅⼤件是精细分⼯完成,⼩件也是如此,在浙江温州 有⼀个打⽕机村,⼀个⼩⼩的打⽕机⽣产,是由20多个⼚家协作完成,有的做打⽕机燃料有的做点⽕器。

反观软件⾏业,这种精细分⼯很难实现, 你⻅过哪家某个系统是由⼗⼏家企业协作完成的么?你觉得淘宝的电商系统可以让⽇本⼈去开发 购物⻋模块、让法国⼈实现评论模块、让印度⼈去实现下单功能、美国⼈实现商品模块,最后在由中国⼈拼装整合?究期原因再于三个字:“标准化”,刚说的汽⻋3万个零件,每个都有其标准化规格,所以才能够顺利的拼装成品,但软件组成很难标准,就连开发个接⼝都没有指定标准,就连⼀个规范都难于推⾏。没有标准化,不能分⼯协作,那怎么实现软件的⼤规模⽣产呢?就是⽤更多的⼈,更多⼯作时⻓去冲抵。软件开发就此成为⼀个劳动密集型产业,新⽣代信息化农⺠⼯群体诞⽣。这对企业⽽⾔是不利的,因为它要为信息化付出更多的成本。所以相应管理办法与开发⼯具都要升级,管理办法是类似于敏捿开发、⼯程师⽂化建设、开发形为准则。另外⼀个就是⼯具:⾃动化构建、⾃动化部署、⾃动化运维、⾃动化扩容等、线上链路监控等等。

分布式链路监控的作用

精准测试之分布式调用链底层逻辑

1. 定位线上问题; 2. 分极性能问题; 3. 降纸软件复杂度; 4. 提供决策数据⽀持。

⼆、调用链系统的演进

精准测试之分布式调用链底层逻辑

⼀般我们认为链路监控产品是从 2010 年 Google 发表名为 《Dapper⼤规模分布式系统的跟踪系统》论⽂开始流⾏起来的。之后出现的很多开源或者闭源的产品都是以 Dapper 为理论基础。下表列出已知的链路监控系统。

链路监控系统列表

公司 系统名称
Google Dapper
阿里巴巴 鹰眼
腾讯 天机
百度 凤睛
京东 CallGraph,hydra
美团点评 CAT(Central Application Tracking)
美团 MTRace
链家 LTrace
苏宁易购 Hiro
Uber Jaeger
Twitter Zipkin
网易 Pylon
个人开源 PinPoint
Apache Apache SkyWalking

淘宝鹰眼 鹰眼界面

精准测试之分布式调用链底层逻辑

鹰眼架构

精准测试之分布式调用链底层逻辑

Google Dapper

Dapper 界⾯

精准测试之分布式调用链底层逻辑

Dapper架构图

精准测试之分布式调用链底层逻辑

开源链路监控

精准测试之分布式调用链底层逻辑

三、调用链系统的底层实现逻辑

调用链系统的本质

⼀张⽹⻚,要经历怎样的过程,才能抵达⽤户⾯前?

⽹络传输层

精准测试之分布式调用链底层逻辑

精准测试之分布式调用链底层逻辑

负载均衡层

精准测试之分布式调用链底层逻辑

系统服务层

精准测试之分布式调用链底层逻辑

调用链基本元素

  1. 事件:请求处理过程当中的具体动作。

  2. 节点:请求所经过的系统节点,即事件的空间属性。

  3. 时间:事件的开始和结束时间。

  4. 关系:事件与上⼀个事件关系。

调⽤链系统本质上就是⽤来回答这⼏问题:

  1. 什么时间?

  2. 在什么节点上?

  3. 发⽣了什么事情?

  4. 这个事情由谁发起?

事件捕捉

  1. 硬编码埋点捕捉

  2. AOP埋点捕捉

  3. 公开组件埋点捕捉

  4. 字节码插桩捕捉

事件串联

事件串联的⽬的:

  1. 所有事件都关联到同⼀个调⽤

  2. 各个事件之间层级关系

为了到达这两个⽬的地,⼏乎所有的调⽤链系统都会有以下两个属性:

traceID:在整个系统中唯⼀,该值相同的事件表示同⼀次调⽤。

spanD:在⼀次调⽤中唯⼀、并展出事件的层级关系

1、怎么⽣成TraceID

2、怎么传递参数

3、怎么并发情况下不允响传递的结果

精准测试之分布式调用链底层逻辑

串联的过程:

  1. 由跟踪的起点⽣成⼀个TraceId, ⼀直传递⾄所有节点,并保存在事件属性值当中。

  2. 由跟踪的起点⽣成初始SpanId,每捕捉⼀个事件ID加1,每传递⼀次,层级加1。

trackId与SpanId 的传递

精准测试之分布式调用链底层逻辑

SpanId ⾃增⽣成⽅式

我们的埋点是埋在具体某个实现⽅法类,当多线程调⽤该⽅法时如何保证⾃增正确性?

精准测试之分布式调用链底层逻辑

解决办法是每个跟踪请求创建⼀个互相独⽴的会话,SpanId的⾃增都基于该会话实现。通常会话对象的存储基于ThreadLocal实现。

事件的开始与结束

我们知道⼀个事件是⼀个时间段内系统执⾏的若⼲动作,所以对于事件捕捉必须包含开启监听和结束监听两个动作?如果⼀个事件在⼀个⽅法内完成的,这个问题是⽐较好解决的,我们只要在⽅法的开始创建⼀个Event对象,在⽅法结束时调⽤该对像的close ⽅法即可。

精准测试之分布式调用链底层逻辑

但如果⼀个事件的开始和结束触发分布在多个对象或⽅法当中,情况就会变得异常复杂。

⽐如⼀个JDBC执⾏事件,应该是在构建 Statement 时开始,在Statement 关闭时结束。怎样把这两个触发动作对应到同⼀个事件当中去呢(即传递Event对象)?在这⾥的解决办法是对返回结果进⾏动态代理,把Event放置到代理对象的属性当中,以达到付递的⽬标。当这个⽅法只是适应JDBC这⼀个场景,其它场景需要重新设计Event 传递路径,⽬前还没有通⽤的解决办法。

精准测试之分布式调用链底层逻辑

上传

上传有两种⽅式

  1. 基于RPC直接上传

  2. 打印⽇志,然后在基于Flume或Logstash采集上传。

第⼀种相对简单,直接把数据发送服务进⾏持久化,但如果系统流量较⼤的情况下,会影响系统本身的性能,造成压力。

第⼆种相对复杂,但可以应对⼤流量,通常情况下会采⽤第⼆种解决办法。

四、Span内容组成

Span基本内容

在调⽤链中⼀个Span,即代表⼀个时间跨度下的行为动作,它可以是在⼀个系统内的时间跨度,也可能是跨多个服务系统的。下图即是Dapper中关于Span的描述。

精准测试之分布式调用链底层逻辑

通常情况下⼀个Span组成包括: 1. 名称:即操作的名称,必须简单可读性⾼,它应该是⼀个抽像通⽤的标识,不能太具体。 2. SpanId:当调⽤中唯⼀ID 3. ParentId:表示其⽗Span 4. 开始与结束时间

端到端Span

一次远程调用需要记录几个Span呢?

我们需要在客户端和服务端分别记录Span信息,这样才能计在两个端的视角分别记录信息。比如计算中间的网络IO。

精准测试之分布式调用链底层逻辑

在Dapper 中分布式请求起码包含如下四个核⼼埋点阶段:

  1. 客户端发送 cs(Client Send):客户端发起请求时埋点,记录客户端发起请求的时间戳

  2. 服务端接收 sr(Server Receive):服务端接受请求时埋点,记录服务端接收到请求的时间戳

  3. 服务端响应 ss(Server Send):服务端返回请求时埋点,记录服务端响应请求的时间戳

  4. 客户端接收 cr(Client Receive):客户端接受返回结果时埋点,记录客户端接收到响应时的时间戳

通过这四个埋点信息,我们可以得到如下信息:

客户端请求服务端的网络耗时:sr-cs

服务端处理请求的耗时:ss-sr

服务端发送响应给客户端的网络耗时:cr-ss

本次请求在这两个服务之间的总耗时:cr-cs

以上这些埋点在 Dapper 中有个专业的术语,叫做 Annotation。如果 Dapper 论⽂中的图示你还没有看太懂的话,那么可以再看看下⾯这张图,⽐较清楚的展示出整个过程。

精准测试之分布式调用链底层逻辑

参考

Dapper论文:https://research.google/pubs/pub36356/

Dapper大规模分布式系统跟踪基础设施论文:https://storage.googleapis.com/pub-tools-public-publication-data/pdf/36356.pdf

点赞
收藏
评论区
推荐文章
Tommy744 Tommy744
3年前
DevOps简介
DevOps是一个完整的面向IT运维的工作流,以IT自动化以及持续集成(CI)、持续部署(CD)为基础,来优化程式开发、测试、系统运维等所有环节。DevOps的概念DevOps一词的来自于Development和Operations的组合,突出重视软件开发人员和运维人员的沟通合作,通过自动化流程来使得软件构建、测试、发布更加快捷、频繁和可靠。
Stella981 Stella981
2年前
Opentracing + Uber Jaeger 全链路灰度调用链,Nepxion Discovery
当网关和服务在实施全链路分布式灰度发布和路由时候,我们需要一款追踪系统来监控网关和服务走的是哪个灰度组,哪个灰度版本,哪个灰度区域,甚至监控从HttpHeader头部全程传递的灰度规则和路由策略。这个功能意义在于:不仅可以监控全链路中基本的调用信息,也可以监控额外的灰度信息,有助于我们判断灰度发布和路由是否执行准确,一旦有问题,也可以快速定位
Wesley13 Wesley13
2年前
APM监控
一,基础知识储备分布式跟踪的目标一个分布式系统由若干分布式服务构成,每一个请求会经过多个业务系统并留下足迹,但是这些分散的数据对于问题排查,或是流程优化都很有限,要能做到追踪每个请求的完整链路调用,收集链路调用上每个服务的性能数据,计算性能数据和比对性能指标(SLA),甚至能够再反馈到服务治理中,那么这就是分布式跟踪的目标。分布式跟踪的目的
Stella981 Stella981
2年前
DevOps简介
DevOps是一个完整的面向IT运维的工作流,以IT自动化以及持续集成(CI)、持续部署(CD)为基础,来优化程式开发、测试、系统运维等所有环节。DevOps的概念DevOps一词的来自于Development和Operations的组合,突出重视软件开发人员和运维人员的沟通合作,通过自动化流程来使得软件构建、测试、发布更加快捷、频繁和
Stella981 Stella981
2年前
Spring Boot + Spring Cloud 构建微服务系统(八):分布式链路追踪(Sleuth、Zipkin)
技术背景在微服务架构中,随着业务发展,系统拆分导致系统调用链路愈发复杂,一个看似简单的前端请求可能最终需要调用很多次后端服务才能完成,那么当整个请求出现问题时,我们很难得知到底是哪个服务出了问题导致的,这时就需要解决一个问题,如何快速定位服务故障点,于是,分布式系统调用链追踪技术就此诞生了。ZipKinZipkin是一个
Stella981 Stella981
2年前
Istio调用链埋点原理剖析—是否真的“零修改”分享实录(下)
调用链原理和场景!0116_1.jpg(https://oscimg.oschina.net/oscnet/419b04f916672de6a65053509e349cc0d29.jpg"1547602375965695.jpg")正如ServiceMesh的诞生是为了解决大规模分布式服务访问的治理问题,调用链的出现也是为了对应于大规模的复杂
Easter79 Easter79
2年前
SpringCloud系列:利用SpringCloud Sleuth和Zipkin实现分布式服务调用链跟踪(一)
一、概述在单体应用时代,接口缓慢能够被迅速定位和发现,而随着分布式微服务的流行,服务之间的调用关系越来越复杂,错中复杂的调用关系使得我们想找到某一个接口的效率缓慢变得非常困难,而分布式服务调用跟踪组件就解决了这个问题。Sleuth是SprinCloud在分布式系统中提供追踪解决方案,zipkin是基于GoogleDapper的分布式链路调用监
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
分布式系统中的分布式链路追踪与分布式调用链路
在分布式系统中,由于服务间的调用关系复杂,需要实现分布式链路追踪来跟踪请求在各个服务中的调用路径和时间消耗。这对问题排查和性能监控都很重要。常用的分布式链路追踪实现有基于日志的和基于分布式追踪系统的两种方式: