系統微服務化後,一次請求涉及的服務可能很多,如果這次請求失敗了,如何快速定位到是哪個系統出的問題呢?這就是我們這篇文章要講解的服務追蹤系統。
服務追蹤系統的作用
快速定位請求失敗的原因或者節點:可以透過追蹤系統的日誌記錄。
最佳化系統瓶頸:可以透過上下游每個節點的服務狀態快速定位到有效能瓶頸的節點。
最佳化系統呼叫鏈路:可以透過追蹤系統呼叫路徑分析得知一個服務依賴了多個下游服務,或者一個介面呼叫相同的介面請求次數太多,可以針對這些請求呼叫進行必要的最佳化。
生成網路拓撲圖:可以使服務依賴呼叫清晰展示
透明資料傳輸:比如可以讓一個引數能在一次分散式請求一直傳遞下去,並且可以在不同的rpc中介軟體傳遞,常用於業務A/B 測試,下游服務獲取到test標識就可以走test策略。
服務追蹤系統原理
追蹤系統核心原理:透過一個全域性的ID,將分佈在各個服務節點上的同一次請求進行串聯,還原原有的服務呼叫關係、追蹤系統問題、分析呼叫資料、統計系統指標。
各種各樣的服務追蹤系統都是基於Google 釋出的一篇的《Dapper》 論文衍生出來的,比較有名的有 Twitter 的Zipkin、阿里的鷹眼、美團的MTrace等。
以下我們以美團的MTrace作為案例,給你詳細講解服務追蹤系統的實現原理。
服務追蹤系統裡面主要涉及如下幾個概念:
traceId:全域性唯一,用於標識一次分散式請求,在RPC網路呼叫中傳遞。
spanId:標識一次RPC請求在分散式請求中的位置,區分不同服務之間的呼叫先後關係。
annotation:使用者傳遞業務自定義的埋點資料,可以將業務感興趣的資料傳遞到後端,比如該次請求的使用者ID。
比如traceId和spanId網路中傳遞如下:
服務追蹤系統實現
先來看下服務追蹤系統的架構圖:
根據上面的服務追蹤系統架構圖,可以看到,一個追蹤系統大概可以分為以下三層:
資料採集層:負責資料的埋點和上報
資料處理層:負責資料的儲存和處理
資料展示層:負責資料的展示
我們來看看每一層的具體實現方式
1。資料採集層
資料採集層作用在系統的各個模組中進行資料請求埋點,採集資料並上報給資料處理層處理。
資料埋點上報方式:
SDK:可以透過統一的SDK顯示的上報埋點,對程式碼傾入性強。
Agent代理:可以透過Agent代理的方式,服務方先將埋點資訊寫入本地檔案,透過Agent代理自動將資料進行轉發上傳。
看一下埋點流程圖:
圖中紅色方框標出了一次服務A呼叫服務B的全過程,一次RPC請求分為四個階段:CS SR SS CR
CS(Client Send)階段:客戶端發起請求,並生成呼叫的上下文。
SR(Server Recieve)階段:服務端接收到請求,並生產上下文。
SS(Server Send)階段:服務端返回請求到客戶端,並將服務端上下文資料上報。
CR(Client Recieve)階段:客戶端接收到服務端返回結果,並將客戶端上下文資料上報。
如下面的埋點和上報案例:
2。資料處理層
資料處理層的作用就是將採集上報過來的資料按需計算,並落地儲存供查詢使用。
資料處理一般分為:
實時資料處理(一般秒級別):要求對收集的鏈路資料進行秒級別的聚合計算供實時查詢使用。一般採用 Storm 或者 Spark Streaming 來對鏈路資料進行實時聚合加工,儲存一般使用 OLTP 資料倉,比如 HBase,使用 traceId 作為 RowKey,能天然地把一整條呼叫鏈聚合在一起,提高查詢效率。
離線資料處理(一般小時級別):對資料的時效性要求不高,一般在小時級別完成鏈路資料的聚合計算即可,常用於資料彙總統計。一般透過執行 MapReduce 或者 Spark 批處理程式來對鏈路資料進行離線計算,儲存一般使用 Hive。
3。資料展示層
資料展示層的作用就是將資料處理層處理後的資料以圖形化額方式展示給使用者。
一般有兩種圖形展示方式
呼叫鏈路圖:展示服務呼叫的整體情況以及每一層的情況,主要用於故障定位,比如某一次使用者呼叫失敗了,可以透過呼叫鏈路圖查詢這次使用者呼叫失敗所導致。
呼叫拓撲圖:展示系統包含哪些應用,他們之間的關係以及依賴呼叫的QPS、平均耗時,主要用於全域性監控,比如,某一個服務突然出現異常,那麼在呼叫鏈路拓撲圖中可以看出對這個服務的呼叫耗時都變高了,可以用紅色的圖樣標出來,用作監控報警。
如下展示zipkin的鏈路圖:
如下展示pinpoint的拓撲圖:
今天就總結到這裡,歡迎喜歡我的讀者繼續關注我,沒關注我的點選【關注】,期待後續更新。