隨着公司業務的高速發展,公司服務之間的調用關係越發複雜,如何理清並跟蹤它們之間的調用關係就顯的比較關鍵。線上每個請求會通過多個業務系統,併產生對各類緩存或者 DB 的訪問,可是這些分散的數據對於問題排查,或者流程優化提供的幫助有限。在這樣複雜的業務場景下,業務流會通過不少個微服務的處理和傳遞,咱們不免會遇到這些問題:html
對於上面那些問題,業內已經有了一些具體實踐和解決方案。經過調用鏈的方式,把一次請求調用過程完整的串聯起來,這樣就實現了對請求鏈路的監控。前端
在業界,目前已知的分佈式跟蹤系統,好比「Twitter Zipkin 與淘寶鷹眼」,設計思想都是來自 Google Dapper 的論文 「Dapper, a Large-Scale Distributed Systems Tracing Infrastructure」git
圖1:這個路徑由用戶的X請求發起,穿過一個簡單的服務系統。用字母標識的節點表明分佈式系統中的不一樣處理過程。github
分佈式服務的跟蹤系統須要記錄在一次特定的請求後系統中完成的全部工做的信息。舉個例子,圖1展示的是一個和5臺服務器相關的一個服務,包括:前端(A),兩個中間層(B和C),以及兩個後端(D和E)。當一個用戶(這個用例的發起人)發起一個請求時,首先到達前端,而後發送兩個 RPC 到服務器 B 和 C 。B 會立刻作出反應,可是 C 須要和後端的 D 和 E 交互以後再返還給 A ,由 A 來響應最初的請求。對於這樣一個請求,簡單實用的全鏈路跟蹤的實現,就是爲服務器上每一次你發送和接收動做來收集與跟蹤sql
cs - CLIENT_SEND,客戶端發起請求 sr - SERVER_RECIEVE,服務端收到請求 ss - SERVER_SEND,服務端處理完成,發送結果給客戶端 cr - CLIENT_RECIEVE,客戶端收到響應
公司 | 選項 | 是否開源 | 優缺點 |
---|---|---|---|
淘寶 | EagleEye | 否 | 主要基於內部 HSF 實現,HSF 沒有開源,故鷹眼也沒有開源 |
Zipkin | 是 | 基於 Http 實現,支持語言較多,比較適合咱們公司業務 | |
點評 | CAT | 是 | 自定義改造難度大,代碼比較複雜,侵入代碼,須要埋點 |
京東 | Hydra | 是 | 主要基於 Dubbo 實現,不適合公司 Http 請求爲主的場景 |
綜上,考慮到公司目前以 Http 請求爲主的場景,最終決定採用參考 Zipkin 的實現思路,同時以 OpenTracing 標準來兼容多語言客戶端數據庫
通常全鏈路跟蹤系統主要有四個部分:數據埋點、數據傳輸、數據存儲、查詢界面後端
目前支持的中間件有:緩存
咱們在 SDK 與後端服務之間加了一層 Kafka ,這樣作既能夠實現工程解耦,又能夠實現數據的延遲消費,起到削峯填谷的做用。咱們不但願由於瞬時 QPS 太高而致使數據丟失,固然爲此也付出了一些實效性上的代價。服務器
數據存儲採用 ElasticSearch ,主要存儲 Span 與 Annotation 相關的數據,考慮到數據量的規模,先期只保存最近 1 個月的數據。架構
經過可視化 Web 界面來查詢分佈式調用鏈路,同時還提供根據項目維度分析依賴聚合
使用 Zipkin 官網 UI 的時候,會偶發性的出現業務加載超時。
緣由是 Zipkin 加載頁面的時候會一次性加載該項目裏面全部的 Span ,當項目使用 Restful 形式的 API 時,就會產生幾百萬的 Span。最後,咱們重寫 UI 頁面採用懶加載的方式,默認展現最近 10 條 Span,同時支持輸入字符來動態查詢 Span 的功能。
當使用頁面查詢 Trace 的時候,發現某個鏈路堆積到上千條 Span
排查下來,業務方使用 HttpClient 中間件發送 Http 請求超時的時候,SDK 並未攔截超時對應的異常,致使事件一直在存儲在線程對應的 ThreadLocal 中
全鏈路跟蹤系統關鍵點:調用鏈。
每次請求都生成全局惟一的 TraceID,經過該 ID 將不一樣的系統串聯起來。實現調用鏈跟蹤,路徑分析,幫助業務人員快速定位性能瓶頸,排查故障緣由。