服务追踪的作用

  • 快速定位请求失败的原因
  • 优化系统瓶颈
    • 记录链路上的消耗
  • 优化链路调用
    • 减少服务依赖
    • 避免跨数据中心
  • 生成网络拓扑
  • 透明传输数据
    • 携带一些数据,在各服务间传递
    • A/B 测试

服务追踪系统原理

服务追踪系统的鼻祖,Google 发布的一篇的论文 Dapper, a Large-Scale Distributed Systems Tracing Infrastructure

核心理念就是调用链:通过一个全局唯一的 ID 将分布在各个服务节点上的同一次请求串联起来,从而还原原有的调用关系,可以追踪系统问题、分析调用数据并统计各种系统指标。

可以说后面的诞生各种服务追踪系统都是基于 Dapper 衍生出来的,比较有名的有 Twitter 的 Zipkin、阿里的鹰眼、美团的 MTrace 等。

基本概念

image.png

  • traceId: 全局请求 id
  • spanId: 层次 id
  • annotation: 业务自定义埋点数据

应该将整个请求链路看成树状或图状.

服务追踪系统实现

服务追踪系统的架构

image.png

服务追踪系统可以分为三层:

  • 数据采集层,负责数据埋点并上报。
  • 数据处理层,负责数据的存储与计算。
  • 数据展示层,负责数据的图形化展示。

1. 数据采集层

数据埋点的流程:

image.png

以红色方框里圈出的 A 调用 B 的过程为例,一次 RPC 请求可以分为四个阶段:

  1. CS(Client Send)阶段 : 客户端发起请求,并生成调用的上下文。
  2. SR(Server Recieve)阶段 : 服务端接收请求,并生成上下文。
  3. SS(Server Send)阶段 : 服务端返回请求,这个阶段会将服务端上下文数据上报,下面这张图可以说明上报的数据有:traceId=123456,spanId=0.1,appKey=B,method=B.method,start=103,duration=38。
  4. CR(Client Recieve)阶段 : 客户端接收返回结果,这个阶段会将客户端上下文数据上报,上报的数据有:traceid=123456,spanId=0.1,appKey=A,method=B.method,start=103,duration=38。

image.png

想要理解上图需要关注数据上报点 (SS, CR) 在哪, 和服务可能同时会是 SS, CR.

2. 数据处理层

  • 实时计算需求
    • Storm, Spark Streaming
    • OLTP 数据仓库
      • HBase
  • 离线计算需求
    • MapReduce
    • Spark

3. 数据展示层

  • 调用链路图
    • 服务整体情况
    • 每一层的情况

image.png

  • 调用拓扑图

image.png