理解了这三个概念,接下来我看看分布式追踪系统如何采集统一图中的微服务调用链
文章插图
我们可以看到底层有一个 Collector 一直在默默无闻地收集数据,那么每一次调用 Collector 会收集哪些信息呢 。
- 全局 trace_id:这是显然的,这样才能把每一个子调用与最初的请求关联起来
- span_id: 图中的 0,1,1.1,2,这样就能标识是哪一个调用
- parent_span_id:比如 b 调用 d 的 span_id 是 1.1,那么它的 parent_span_id 即为 a 调用 b 的 span_id 即 1,这样才能把两个紧邻的调用关联起来 。
文章插图
根据这些图表信息显然可以据此来画出调用链的可视化视图如下
文章插图
于是一个完整的分布式追踪系统就实现了 。
以上实现看起来确实简单,但有以下几个问题需要我们仔细思考一下
- 怎么自动采集 span 数据:自动采集,对业务代码无侵入
- 如何跨进程传递 context
- traceId 如何保证全局唯一
- 请求量这么多采集会不会影响性能
SkyWalking的原理及架构设计怎么自动采集 span 数据SkyWalking 采用了插件化 + javaagent 的形式来实现了 span 数据的自动采集,这样可以做到对代码的 无侵入性,插件化意味着可插拔,扩展性好(后文会介绍如何定义自己的插件)
文章插图
如何跨进程传递 context我们知道数据一般分为 header 和 body, 就像 http 有 header 和 body, RocketMQ 也有 MessageHeader,Message Body, body 一般放着业务数据,所以不宜在 body 中传递 context,应该在 header 中传递 context,如图示
文章插图
dubbo 中的 attachment 就相当于 header ,所以我们把 context 放在 attachment 中,这样就解决了 context 的传递问题 。
文章插图
推荐阅读
- 在Linux中使用Bashtop与Bpytop监管系统资源
- 腾讯健康系统实名认证怎么修改?
- 推荐系统架构治理
- 传祺|搭载丰田THS混动系统 全新传祺M8谍照曝光:赛那平替版来了
- Java环境搭建,环境变量配置
- 操作系统底层核心讲解
- win7系统更新一直不动了怎么办,windows7一直更新启动不了?
- 简单、快速解决系统分区C盘空间不足的3种方法
- 新闻个性化推荐系统源码之构建离线用户画像
- Java分布式锁看这篇就够了