分布式链路跟踪中的 traceid 和 spanid 代表什么?
在分布式服務(wù)架構(gòu)下,一個(gè) Web 請(qǐng)求從網(wǎng)關(guān)流入,有可能會(huì)調(diào)用多個(gè)服務(wù)對(duì)請(qǐng)求進(jìn)行處理,拿到最終結(jié)果。這個(gè)過(guò)程中每個(gè)服務(wù)之間的通信又是單獨(dú)的網(wǎng)絡(luò)請(qǐng)求,無(wú)論請(qǐng)求經(jīng)過(guò)的哪個(gè)服務(wù)出了故障或者處理過(guò)慢都會(huì)對(duì)前端造成影響。
處理一個(gè)Web請(qǐng)求要調(diào)用的多個(gè)服務(wù)為了能更方便的查詢哪個(gè)環(huán)節(jié)的服務(wù)出現(xiàn)了問(wèn)題,現(xiàn)在常用的解決方案是為整個(gè)系統(tǒng)引入分布式鏈路跟蹤。
在分布式鏈路跟蹤中有兩個(gè)重要的概念:跟蹤(trace)和 跨度( span)。trace 是請(qǐng)求在分布式系統(tǒng)中的整個(gè)鏈路視圖,span 則代表整個(gè)鏈路中不同服務(wù)內(nèi)部的視圖,span 組合在一起就是整個(gè) trace 的視圖。
在整個(gè)請(qǐng)求的調(diào)用鏈中,請(qǐng)求會(huì)一直攜帶 traceid 往下游服務(wù)傳遞,每個(gè)服務(wù)內(nèi)部也會(huì)生成自己的 spanid 用于生成自己的內(nèi)部調(diào)用視圖,并和traceid一起傳遞給下游服務(wù)。
traceid 在請(qǐng)求的整個(gè)調(diào)用鏈中始終保持不變,所以在日志中可以通過(guò) traceid 查詢到整個(gè)請(qǐng)求期間系統(tǒng)記錄下來(lái)的所有日志。請(qǐng)求到達(dá)每個(gè)服務(wù)后,服務(wù)都會(huì)為請(qǐng)求生成spanid,而隨請(qǐng)求一起從上游傳過(guò)來(lái)的上游服務(wù)的 spanid 會(huì)被記錄成parent-spanid或者叫 pspanid。當(dāng)前服務(wù)生成的 spanid 隨著請(qǐng)求一起再傳到下游服務(wù)時(shí),這個(gè)spanid 又會(huì)被下游服務(wù)當(dāng)做 pspanid 記錄。
分布式鏈路跟蹤中的trace和span通過(guò)在訪問(wèn)日志和業(yè)務(wù)日志里記錄的traceid、spanid 和 pspanid 能完整的還原出整個(gè)請(qǐng)求的調(diào)用鏈路視圖,對(duì)錯(cuò)誤排查能起到很大的幫助。
上面就是分布式鏈路跟蹤的原理,我們可以自己實(shí)現(xiàn),也可以依賴 opentracing 這種開源的解決方案。一般是在請(qǐng)求到達(dá)網(wǎng)關(guān)的開始,生成本次請(qǐng)求的traceid 和 在網(wǎng)關(guān)服務(wù)內(nèi)的spanid ,將他們放在HTTP 請(qǐng)求頭或者RPC調(diào)用的元數(shù)據(jù)里,在調(diào)用下游服務(wù)時(shí)繼續(xù)向下傳遞。下游的RESTful API服務(wù)的全局路由中間件和RPC服務(wù)的攔截器里會(huì)接收請(qǐng)求攜帶的traceid 和生成當(dāng)次請(qǐng)求在服務(wù)內(nèi)部的spanid,從上游接收到的 spanid 在這里會(huì)被轉(zhuǎn)換成 pspanid。除此之外我們甚至可以把 traceid 和 spanid 注入到一些數(shù)據(jù)庫(kù)連接池應(yīng)用里,讓記錄的慢SQL日志里同樣能打上 traceid 和 spanid 信息,為請(qǐng)求的響應(yīng)過(guò)慢提供有效的分析數(shù)據(jù)。
總結(jié)
以上是生活随笔為你收集整理的分布式链路跟踪中的 traceid 和 spanid 代表什么?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 175 道面试必考 Go 语言题目详细解
- 下一篇: 你真的了解 CDC 吗?