## 分布式跟蹤系統設計目標
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