1. 程式人生 > >一文讀懂鏈路追蹤

一文讀懂鏈路追蹤

背景介紹

在微服務橫行的時代,服務化思維逐漸成為了程式設計師的基本思維模式,但是,由於絕大部分專案只是一味地增加服務,並沒有對其妥善管理,當接口出現問題時,很難從錯綜複雜的服務呼叫網路中找到問題根源,從而錯失了止損的黃金時機。

而鏈路追蹤的出現正是為了解決這種問題,它可以在複雜的服務呼叫中定位問題,還可以在新人加入後臺團隊之後,讓其清楚地知道自己所負責的服務在哪一環。

除此之外,如果某個介面突然耗時增加,也不必再逐個服務查詢耗時情況,我們可以直觀地分析出服務的效能瓶頸,方便在流量激增的情況下精準合理地擴容。

鏈路追蹤

“鏈路追蹤”一詞是在2010年提出的,當時谷歌釋出了一篇Dapper論文,介紹了谷歌自研的分散式鏈路追蹤的實現原理,還介紹了他們是怎麼低成本實現對應用透明的。

其實Dapper一開始只是一個獨立的呼叫鏈路追蹤系統,後來逐漸演化成了監控平臺,並且基於監控平臺孕育出了很多工具,比如實時預警、過載保護、指標資料查詢等。

除了谷歌的dapper,還有一些其他比較有名的產品,比如阿里的鷹眼、大眾點評的CAT、Twitter的Zipkin、Naver(著名社交軟體LINE的母公司)的pinpoint以及國產開源的skywalking等。

基本實現原理

如果想知道一個介面在哪個環節出現了問題,就必須清楚該介面呼叫了哪些服務,以及呼叫的順序,如果把這些服務串起來,看起來就像鏈條一樣,我們稱其為呼叫鏈。

想要實現呼叫鏈,就要為每次呼叫做個標識,然後將服務按標識大小排列,可以更清晰地看出呼叫順序,我們暫且將該標識命名為spanid。

實際場景中,我們需要知道某次請求呼叫的情況,所以只有spanid還不夠,得為每次請求做個唯一標識,這樣才能根據標識查出本次請求呼叫的所有服務,而這個標識我們命名為traceid。

現在根據spanid可以輕易地知道被呼叫服務的先後順序,但無法體現呼叫的層級關係,正如下圖所示,多個服務可能是逐級呼叫的鏈條,也可能是同時被同一個服務呼叫。

所以應該每次都記錄下是誰呼叫的,我們用parentid作為這個標識的名字。

到現在,已經知道呼叫順序和層級關係了,但是接口出現問題後,還是不能找到出問題的環節,如果某個服務有問題,那個被呼叫執行的服務一定耗時很長,要想計算出耗時,上述的三個標識還不夠,還需要加上時間戳,時間戳可以更精細一點,精確到微秒級。

只記錄發起呼叫時的時間戳還算不出耗時,要記錄下服務返回時的時間戳,有始有終才能算出時間差,既然返回的也記了,就把上述的三個標識都記一下吧,不然區分不出是誰的時間戳。

雖然能計算出從服務呼叫到服務返回的總耗時,但是這個時間包含了服務的執行時間和網路延遲,有時候我們需要區分出這兩類時間以方便做針對性優化。那如何計算網路延遲呢?我們可以把呼叫和返回的過程分為以下四個事件。

  • Client Sent簡稱cs,客戶端發起呼叫請求到服務端。

  • Server Received簡稱sr,指服務端接收到了客戶端的呼叫請求。

  • Server Sent簡稱ss,指服務端完成了處理,準備將資訊返給客戶端。

  • Client Received簡稱cr,指客戶端接收到了服務端的返回資訊。

假如在這四個事件發生時記錄下時間戳,就可以輕鬆計算出耗時,比如sr減去cs就是呼叫時的網路延遲,ss減去sr就是服務執行時間,cr減去ss就是服務響應的延遲,cr減cs就是整個服務呼叫執行的時間。

其實span塊內除了記錄這幾個引數之外,還可以記錄一些其他資訊,比如發起呼叫服務名稱、被調服務名稱、返回結果、IP、呼叫服務的名稱等,最後,我們再把相同spanid的資訊合成一個大的span塊,就完成了一個完整的呼叫鏈。感興趣的同學可以去深入瞭解一下鏈路追蹤,希望本文對你有所幫助。

相關推薦

追蹤

背景介紹 在微服務橫行的時代,服務化思維逐漸成為了程式設計師的基本思維模式,但是,由於絕大部分專案只是一味地增加服務,並沒有對其妥善管理,當接口出現問題時,很難從錯綜複雜的服務呼叫網路中找到問題根源,從而錯失了止損的黃金時機。 而鏈路追蹤的出現正是為了解決這種問題,它可以在複雜的服務呼叫中定位問題,還可以

區塊vs.DAG, 區別到底是什麼? 燒腦的資料結構之爭

作者 | 劉春明 DAG(有向無環圖)是一種非線性資料結構,可以替代區塊鏈,用於分散式賬本的儲存。這種結構在併發的場景下有更好的效能表現,但在實際應用中會面臨更多的技術挑戰。 其中,最大的挑戰在於,基於DAG結構實現智慧合約,要比基於區塊鏈結構困難得多。 本文將討論DAG和

區塊產業鏈結構

    隨著區塊鏈的發展,區塊鏈產業鏈逐步形成,本文和大家分享的就是區塊鏈的產業結構,一起來看看吧。   上游:礦機產業   礦機產業可以說是區塊鏈產業的上游產業。   沒有礦機產業,就沒有礦機,沒有礦機, 礦工當然可以使用普通計算來挖礦。   但是,問題是,沒有專業的礦機,普

AI洞觀 | 英特爾的AI之

關注網易智慧,聚焦AI大事件,讀懂下一個大時代!出品 | 網易智慧(公眾號 smartman16

分享實錄|區塊整體架構及應用方向

1 區塊鏈概念及特徵 1、區塊鏈的定義 相較於區塊鏈,大家似乎更瞭解比特幣。區塊鏈是一種技術,支撐和保障整個比特幣的貨幣機制在這樣一個分散式網路中執行,包括產生、流通、交易等等。 簡單來說它就是一個賬本,在整個交易過程中,每產生一筆交易,大家

微服務監控之分散式追蹤

現在越來越多的應用遷移到基於微服務的雲原生的架構之上,微服務架構很強大,但是同時也帶來了很多的挑戰,尤其是如何對應用進行除錯,如何

Salesforce學習之-developer篇(五)Aura原理及實戰案例分析

很喜歡曾經看到的一句話:以輸出倒逼輸入。以輸出的形式強制自己學習,確實是高效的學習方式,真的很棒。以下僅為個人學習理解,如有錯誤,歡迎指出,共同學習。   1. 什麼是Lightning Component框架?  Lightning Component框架是一個UI框架,用於為移動和

大數據計算框架與平臺

ddr 不同 失敗 克服 可定制 同時 數據庫引擎 後處理 alc  1.前言   計算機的基本工作就是處理數據,包括磁盤文件中的數據,通過網絡傳輸的數據流或數據包,數據庫中的結構化數據等。隨著互聯網、物聯網等技術得到越來越廣泛的應用,數據規模不斷增加,TB、PB量級成為常

超簡單的 structured stream 源碼解讀

ket exec res exce bus sin imp += work 為了讓大家理解structured stream的運行流程,我將根據一個代碼例子,講述structured stream的基本運行流程和原理。 下面是一段簡單的代碼: 1 val spark =

Spring Boot、微服務架構和大數據治理之間的故事

Springboot微服務架構 微服務的誕生並非偶然,它是在互聯網高速發展,技術日新月異的變化以及傳統架構無法適應快速變化等多重因素的推動下誕生的產物。互聯網時代的產品通常有兩類特點:需求變化快和用戶群體龐大,在這種情況下,如何從系統架構的角度出發,構建靈活、易擴展的系統,快速應對需求的變化;同時,隨著用戶的

阻塞、非阻塞、同步、異步IO

UC max register class 掃描 基本 角度 cloud 問題: 介紹 在談及網絡IO的時候總避不開阻塞、非阻塞、同步、異步、IO多路復用、select、poll、epoll等這幾個詞語。在面試的時候也會被經常問到這幾個的區別。本文就來講一下這幾個詞

架構師都不知道的isinstance檢查機制

Python起步通過內建方法 isinstance(object, classinfo) 可以判斷一個對象是否是某個類的實例。但你是否想過關於鴨子協議的對象是如何進行判斷的呢? 比如 list 類的父類是繼 object 類的,但通過 isinstance([], typing.Iterable) 返回的卻是

【深度學習】機器學習常用損失函數(Loss Function)

back and 們的 wiki 導出 歐氏距離 classes 自變量 關於 最近太忙已經好久沒有寫博客了,今天整理分享一篇關於損失函數的文章吧,以前對損失函數的理解不夠深入,沒有真正理解每個損失函數的特點以及應用範圍,如果文中有任何錯誤,請各位朋友指教,謝謝~

從HTTP/0.9到HTTP/2:HTTP協議的歷史演變和設計思路

eight 結果 key 視頻 this sso單點登陸 會有 研究 patch 本文原作者阮一峰,作者博客:ruanyifeng.com。 1、引言 HTTP 協議是最重要的互聯網基礎協議之一,它從最初的僅為瀏覽網頁的目的進化到現在,已經是短連接通信的事實工業標準,最新版

以太坊代幣合約

規則 sta ini class 2015年 交易 存在 部分 生活 本文首發自 https://www.secpulse.com/archives/73696.html ,轉載請註明出處。 工欲善其事,必先利其器。要想挖掘和分析智能合約的漏洞,你必須要先學會看

什麽是音視頻直播雲服務 ?

type 限制 推流 數據 優缺點 視頻通訊系統 最終 通訊 地理 說到音視頻雲服務,大多數人可能聯想到的是網絡直播應用場景,實際上,硬件對音視頻雲服務的需求也在逐漸提升。而這樣的市場需求也推動了整個行業的發展,目前,阿裏雲、騰訊雲和網易雲等巨頭都已入局,除此之外還有即構科

機器學習大殺器XGBoost原理

結構 近似算法 機器 form con gin fff .cn tran http://blog.itpub.net/31542119/viewspace-2199549/ XGBoost是boosting算法的其中一種。Boosting算法的思想是將許多弱分類器集成在

什麽是Java中的自動拆裝箱

.com 空指針異常 http har 三目運算 容器 ava eof 關系 基本數據類型 基本類型,或者叫做內置類型,是Java中不同於類(Class)的特殊類型。它們是我們編程中使用最頻繁的類型。 Java是一種強類型語言,第一次申明變量必須說明數據類型,第一次變量

高性能網絡編程中的I/O模型

好的 min tcp 輸入 其中 那些事 follow hand 實現 1、前言 隨著互聯網的發展,面對海量用戶高並發業務,傳統的阻塞式的服務端架構模式已經無能為力。本文(和下篇《高性能網絡編程(六):一文讀懂高性能網絡編程中的線程模型》)旨在為大家提供有用的高性能網絡編程

充電寶usb接口電路及制作原理詳細

合規 其它 註意 pan 排列 ron 充電寶 需要 資料 轉自:http://www.elecfans.com/dianlutu/dianyuandianlu/20180511675801.html USB充電器套件,又名MP3/MP4充電器,輸入AC160-240V,5