## 分布式跟踪系统设计目标
1. 低侵入性
2. 灵活的应用策略;(可以 [最好随时] 决定所收集数据的范围和粒度)
3. 时效性;从agent采样,到collect、storage和display尽可能快
4. 决策支持;
5. 可视化是王道;(丰富的数据报表)
6. 低消耗;在web请求链路中,对请求的响应影响尽可能小
7. 延展性;随着业务量暴增,分布式跟踪系统的高可用、和高性能表现依然好
## 分布式跟踪系统标准——[OpenTracing](http://opentracing.io/)
为了规范业界的分布式跟踪系统产品的统一范式,CNCF(大名鼎鼎的Cloud Native Computing Foundation)设计了trace标准,目前uber、apple等知名公司完全遵循该标准设计trace系统。
## 各大厂商trace系统对比
分布式跟踪系统各类产品,根据设计目标和标准形成综合对比:
产品名称 | 厂商 | 开源 | OpenTracing标准 | 侵入性 | 应用策略 | 时效性 | 决策支持 | 可视化 | 低消耗 | 延展性
---|---|---|---|---|---|---|---|---|---|---
[jaeger](https://github.com/jaegertracing/jaeger) | uber | 开源 | 完全支持 | 部分侵入 | 策略灵活 | 时效性高, UDP协议传输数据(在Uber任意给定的一个Jaeger安装可以很容易地每天处理几十亿spans) | 决策支持较好,并且底层支持metrics指标 | 报表不丰富,UI比较简单 | 消耗低 | jaeger比较复杂,使用框架较多,比如:rpc框架采用thrift协议,不支持pb协议之类。后端存储比较复杂。但经过uber大规模使用,延展性好
[zipkin](https://github.com/openzipkin/zipkin) | twitter | 开源 | 部分支持 | 侵入性强 | 策略灵活 | 时效性好 | 决策一般(功能单一,监控维度和监控信息不够丰富。没有告警功能) | 丰富的数据报表 | 系统开销小 | 延展性好
[CAT](https://github.com/dianping/cat) | 大众点评 [吴其敏](http://www.infoq.com/cn/presentations/the-practice-of-open-source-distributed-monitoring-cat-system?utm_source=infoq&utm_medium=videos_homepage&utm_campaign=videos_row3) | 开源 | - | 侵入性强 | 策略灵活 | 时效性较好,rpc框架采用tcp传输数据| 决策好 | 报表丰富,满足各种需求 | 消耗较低 , 国内很多大厂都在使用 | -
[Appdash](https://github.com/sourcegraph/appdash) | sourcegraph | 开源 | 完全支持 | 侵入性较弱 | 采样率支持(粒度:不能根据流量采样,只能依赖于请求数量);没有trace开关 | 时效性高 | 决策支持低 | 可视化太弱,无报表分析 | 消耗方面。不支持大规模部署, 因为appdash主要依赖于memory,虽然可以持久化到磁盘,以及内存存储支持hash存储、带有效期的map存储、以及不加限制的内存存储,前者存储量过小、后者单机内存存储无法满足 | 延展性差
[MTrace](https://tech.meituan.com/mt-mtrace.html) | 美团 | 不开源 | - | - | - | -
CallGraph | 京东 | 不开源 | -
[Watchman](http://www.infoq.com/cn/articles/weibo-watchman) | sina微博 | 不开源 | - |
EagleEye | 淘宝 | 不开源 | -
[skywalking](https://github.com/apache/incubator-skywalking) | 华为 吴晟 | 开源 | 完全支持 | 侵入性很低 | 策略灵活 | 时效性较好 | 由于调用链路的更细化, 但是作者在性能和追踪细粒度之间保持了比较好的平衡。决策好 | 丰富的数据报表 | 消耗较低 | 延展性非常好,水平理论上无限扩展
综合来说,
```shell
1. jaeger对于go开发者来说,可能比较合适一些,但是入手比较困难。它的rpc框架采用thrift协议,现在主流grpc并不支持。后端丰富存储,社区正在积极适配
2. appdash对于go开发者想搭建一个小型的trace比较合适,不适合大规模使用
3. zipkin项目,github很活跃,star数量很多,属于java系。很多大厂使用
4. CAT项目也属于java系, github不活跃,已不太更新了。不过很多大厂使用,平安、大众点评、携程...
5. skywalking项目, 也属于java系。目前已成为Apache下的项目了,github活跃,作者也非常活跃,当当、华为正在使用。
6. appdash项目,go语言开发,因为可视化过于简单、且完全内存存储,不太适合大规模项目使用。
所以选择的话,可以从skywalking、cat、jaeger和zipkin中选择。
```
## 参考资料
[当当11·11:高可用移动入口与搜索新架构实践](http://www.uml.org.cn/zjjs/201711161.asp)
[分布式调用跟踪系统调研笔记](http://ginobefunny.com/post/learning_distributed_systems_tracing/)
[京东分布式服务跟踪系统-CallGraph](http://kuaibao.qq.com/s/20180228B0W70I00?refer=spider)
[全链路监控(一):方案概述与比较](https://juejin.im/post/5a7a9e0af265da4e914b46f1)
[各大厂分布式链路跟踪系统架构对比](https://cloud.tencent.com/developer/article/1137651)
[skywalking](http://skywalking.io/)
- dapper
- Dapper论文
- opentracing标准
- 概念和目标
- 名词与术语
- APIs
- 设计分布式跟踪系统的有效方法
- trace产品对比
- opentracing-go
- Tracer实例
- 上下文信息携带
- 日志
- basictracer-go
- Tracer实例
- Span对象
- 事件与上下文信息携带
- span存储与pb协议
- DEMO
- appdash
- Tracer与Span
- annotations与事件
- 存储
- 近期存储与限制存储
- 反射
- SpanRecorder与Collector
- OpenTracing部分支持
- jaeger
- 特性
- jaeger的演变
- TChannel协议
- 协议标准
- Affinity
- 熔断器
- http与json
- metrics
- 流控
- Thrift
- keyvalue例子
- tcp监听关闭处理方式
- tchannel-go
- channel
- PeerList
- PeerList与Peer
- RootPeerList
- peerScore与idleSweep
- allchannel与subchannel
- connection
- inboundcall与outboundcall
- message exchange
- arguments
- message
- payload-WriteBuffer&ReadBuffer
- payload-Reader
- frame
- frame pool与call options
- context
- json