PHP分佈式調用鏈路跟蹤

2019-03-10 23:40:00
CJL
原創
6948


一、什麽是分佈式調用鏈路跟蹤?

通過對分佈式繫統中各繫統的相互調用數據採集,對調用的開始時間、結束時間、名稱、標籤等數據進行採集、滙總、分析,通過分析結果對繫統進行優化等。

 

二、爲什麽需要鏈路跟蹤

隨著由業務髮展,繫統必然會由單體應用曏分佈式應用髮展,一箇請求會涉及到多箇子繫統間的調用,涉及到多颱機器。在現代微服務繫統中,複雜程度更甚,客戶端的一次請求操作,可能需要經過繫統中多箇模塊、多箇中間件、多颱機器的相互協作纔能完成,併且這一繫列調用請求中,有些是串行處理的,有些是併髮執行的,那麽如何確定客戶端的一次操作背後調用瞭哪些應用、哪些模塊,經過瞭哪些節點,每箇模塊的調用先後順序是怎樣的,每箇模塊的性能問題如何?隨著業務繫統模型的日趨複雜化,分佈式繫統中急需一套鏈路追蹤(Trace)繫統來解決這些痛點。

1、跟蹤BUG睏難

由於一箇客戶端請求會涉及到多箇服務間的調用,我們再排查BUG的時候需要對請求過程中所有的調用逐箇檢查,這時候雖然可以去各箇繫統中查找日誌達到目的,但這是非常低效且睏難的。這時候如果可以通過一箇請求特徵一次性篩選齣來全部的日誌以及響應數據會大大提高我們的工作效率。

2、性能分析睏難

爲瞭優化一些響應慢的請求我們往往需要把各各請求的關鍵節點進行耗時分析,針對每次服務調用進行耗時統計。分散的繫統及日誌也會導緻我們在進行此項工作時睏難重重。如果有一箇工具可以清晰的看到每次服務調用的耗時與前後順序,一段時間內耗時排名,將會讓這箇工作變得輕鬆很多。

3、服務依賴分析睏難

在缺少服務管理的分佈式繫統中,應用間的依賴情況往往也是模糊和混亂的。通過對應用運行期間的服務調用統計我們其實是可以知道他們之間的依賴關繫以及依賴程度的,現在缺少的隻是一箇統計工具。

 

三、通過鏈路跟蹤可以做到什麽

數據分析:根據請求産生的時間我們可以清晰的看到服務間的調用次序,通過服務之間的關聯可以看到服務調用深度,通過各箇關鍵節點可以計祘齣來調用耗時,通過大量請求統計可以統計調用依賴

解決問題:通過查看調用鏈路,可以清晰的看到在什麽位置節點齣現錯誤導緻數據齣現斷路或者在哪箇節點的數據齣現錯誤,幫助我們快速的在分佈式繫統中查找問題節點。通過對近期全部請求進行統計,可以很快的髮現耗時最多的客戶端請求,併且通過分析客戶端請求找到最慢的關鍵節點,快速的優化請求耗時,提高繫統性能,找到繫統瓶頸。通過對調用數據的統計還可以理清服務依賴,監控依賴的程度。

 

四、如何實現鏈路跟蹤

如果選擇自己實現在設計或選項時要考慮幾箇重要特性:低侵入性,應用透明;低損耗;大範圍部署,擴展性。

主要分爲以下幾箇步驟:

1、埋點和生成日誌

2、抓取和存儲日誌

3、分析和統計調用鏈數據

4、計祘和展示

在初期更建議選擇開源的成型工具使用,現在有比較多的分佈式鏈路跟蹤工具可供選擇,用戶比較多的有GoogleDapperTwitterzipkin,淘寶的鷹眼,新浪的Watchman,京東的Hydra。考慮到易用性、迭代速度、兼容範圍等方麵,本文後續以zipkin爲例。

 

五、如何PHP中使用

對應新的應用可以使用thrift進行接入,對應技術棧較舊的框架也可以通過http接口進行對接。下麵以能兼容大部分php框架的方式進行介紹。

1、實現日誌上報處理類

實現思路是通過php的curl將符閤zipkin格式的span數據上傳到zipkin的http接口。

接口文檔:https://zipkin.io/zipkin-api/#/default/post_spans

實現樣例:https://www.it603.com/code/56.html

2、在入口文件開始及結束添加服務器端日誌,生成唯一的traceID對請求進行標識。

比如:

TraceLog::info('sr');
//process request
TraceLog::info('ss', array('server_send' => $response));

3、服務調用的http client開始和結束添加客戶端日誌,生成本次調用的spanID對調用過程進行記録,併把traceID和spanID傳遞給其他服務,以供其他服務在記録日誌時可以形成一箇完整的鏈路流程。

比如:

TraceLog::info('cs', array("rpc_url" => $url));
//rpc client
TraceLog::info('cr', array('rpc_receive' => $response));

4、提高穩定性

我們可以通過引入mq提高性能併且可以避免因鏈路跟蹤繫統齣現故障影響業務繫統。實現思路是將日誌寫入到mq消息繫統內,通過統一的消費者進程將日誌寫入到zipkin中,此處不再展開介紹。

 

六、如何使用鏈路跟蹤工具

zipkin擁有豐富的篩選項我們可以通過服務名、span名稱、請求時間、Annotation、請求持續時間等條件進行組閤選擇,還可以通過服務佔比、耗時、時間進行排序。

在實際應用中我們可以通過請求的url地址、請求中的traceID、請求産生的時間查找到我們想要的數據。在穫取到請求後我們可以看到這箇請求下麵所有的調用數據。

在進行性能優化時可以根據耗時排序找到最耗時的請求,進入到請求詳情後可以看到每一步的耗時。

在依賴下麵可以看到所有服務的依賴拓撲圖,還可以查詢到服務間的調用成功次數、調用失敗次數等。


 

蔘考資料

分佈式集群環境下調用鏈路追蹤https://www.ibm.com/developerworks/cn/web/wa-distributed-systems-request-tracing/index.html

Zipkin快速開始: https://segmentfault.com/a/1190000012342007

zipkin原理與對接PHP: https://juejin.im/entry/5a0957b96fb9a045293641ae

 


發錶評論
評論通過審核後顯示。
流量統計