基於追蹤到的數據流信息,進(jìn)行數據鏈路分析。這包括確定數據(jù)鏈路中的瓶頸、延遲、錯(cuò)誤和數據丟失等問題。通(tōng)過分析數據鏈(liàn)路,可以找出導(dǎo)致問題(tí)的環節,並提供(gòng)相應的優化和改進建議。
在全鏈路消(xiāo)息跟蹤中,數據流的跟蹤和解(jiě)析是一個關鍵步驟,數據(jù)流的跟蹤通常通過在(zài)係統中埋點或攔截(jié)關鍵節點的方式實現。當消息經過這(zhè)些節點(diǎn)時,會(huì)記錄相關的信息,如消息的內容、時間戳、發送者和接收者等。這些信息可(kě)以被捕獲和存儲,用於後續的分析和追蹤。
目前我們設計模式中有三種方式(shì)來進行鏈路數據的跟蹤。
基於日誌的實現方法是消息全鏈路跟蹤的一種常見方式。它通過在每個服(fú)務(wù)或組件中記錄相關的日誌信息(xī)來實現消息的跟(gēn)蹤和監控。下麵是基於(yú)日誌的實現方法的(de)流(liú)程:


基於日誌的實現方法相對簡單且易於擴展(zhǎn),因為它借助於(yú)已經存在的日誌記錄機製和工具。然(rán)而,它也存在一些限製,如(rú)日誌量的增加、日誌傳遞的開銷和跨服務邊界的上下文傳遞等挑戰。因此,在實際應用中,通常需要結合其他技術和方法,如注入式跟蹤和集成式跟(gēn)蹤(zōng)係統,來(lái)實現更全麵和(hé)高效(xiào)的(de)消息全鏈路(lù)跟蹤。
基於注入(rù)的實現(xiàn)方法是消(xiāo)息全鏈(liàn)路(lù)跟蹤(zōng)的另一種常見方式。它通過在消息(xī)傳遞路徑上(shàng)的每個服務或組件中插入代碼(mǎ)來實(shí)現消息的跟蹤和監控。下麵是(shì)基於注入的實現方法的流程:

基(jī)於注(zhù)入的實現方法具有較高的靈活(huó)性(xìng)和精確度(dù),因為它可以直接在代碼中插入跟蹤邏輯。然(rán)而,它也需要在每個服務或組件(jiàn)中(zhōng)進行修改和注入代碼,對現有代碼的侵入性較大。此外,注入的(de)實現方法可能需要更(gèng)多的開發工作和技術支持,以確保正確(què)的跟蹤邏輯和(hé)數據收集。
從前麵兩種實現方式來看,對於現有係統代碼的侵入性相對都比較強,對於已(yǐ)經運營的生(shēng)產係(xì)統來說不是最友好的方式,且定(dìng)製化高(gāo),不易於擴展和維護。因此,就有了第三種實現方法(fǎ)——基於AOP的(de)實現消(xiāo)息記錄。
AOP通過將橫切的信息收集點從業務邏輯中抽象出來,使得信息收集點的實(shí)現可以(yǐ)集中在一個地方,提(tí)高(gāo)了代(dài)碼的模塊(kuài)化和(hé)可維護性,減少代碼冗餘(yú)。其次,AOP使得信息收集點的配置和管理更加集中化,可以更方便地管理和修改(gǎi)信息(xī)收(shōu)集(jí)點(diǎn)的實現。
基於AOP的實現方法,當然也有它特有的實現步驟:

通過基於AOP的實(shí)現方法,可以在關鍵的方法調用或消息傳遞上插入(rù)跟蹤邏(luó)輯,實現消息全鏈路跟蹤。這種方法具有較強的靈(líng)活性(xìng)和可擴(kuò)展性,可以適用於分布式係統。
在實現(xiàn)全鏈路(lù)消息跟蹤時,存儲和索引跟蹤數(shù)據是關鍵的一步。存(cún)儲(chǔ)和索引跟蹤數據可以(yǐ)幫助實(shí)現對消息的快速檢索、分析和查詢,從(cóng)而支持故障排查、性能優化和係統監控等(děng)任務。以(yǐ)下是采用的數據存儲方式:
數據庫存儲:每個消息可以作為一個(gè)記錄,包含(hán)相關的字段(例(lì)如鏈路(lù)追蹤標識符、時間戳、消息唯一標識、傳遞路徑等)。使用數據庫的查詢功(gōng)能可以(yǐ)對跟蹤數據進行靈活的檢索和分析。
搜索引擎跟蹤:為了支持快速(sù)的(de)數據檢索和查詢,以(yǐ)及報文數據的模糊搜(sōu)索,可以使用搜索引擎支持複雜數據的查詢。我們(men)使用Elasticsearch作為消息詳細信息的存儲引擎(qíng),和數據庫存儲結合,通過建立索引來加速對(duì)跟蹤數據的(de)查詢。索引可以基於消息的關鍵字段(如鏈路追蹤標識符、時間戳)進行構建,以便快速地定位和訪(fǎng)問跟蹤數據(jù)。
數據存儲除了中間件的選型,還需要將數據存儲的過程(chéng)和(hé)業務係(xì)統做成解耦,避(bì)免降低業務係統正常功能(néng)的性能情況(kuàng)。
下圖是存儲數據的過(guò)程:

首先通過埋點采(cǎi)集到數據(jù)後,可以(yǐ)將消息以【索引+全量的消(xiāo)息數據】的結構序列化存儲到Redis緩存中;
第二步同步(bù)把重要(yào)索(suǒ)引類信(xìn)息封裝成消息體投(tóu)入到消息隊列中;
然後在消息存儲應用中消費消息隊列的消息,根(gēn)據消息中的索引從Redis中獲取實(shí)際的數(shù)據,寫入到(dào)數(shù)據庫以及Elastic Search中,完成鏈路消息的持久化。
可視化(huà)跟蹤數據是實現全鏈路消息跟蹤的關鍵(jiàn)一步,它可以幫助開發(fā)人員和運維人員更直觀地理解和分析消息傳遞的流程(chéng)和性能。
跟蹤數據流程圖(tú):使用流程圖工具(如(rú)Graphviz、Mermaid、AntV G6)可以繪製跟蹤數(shù)據的(de)流程圖(tú),展示(shì)消息在係統中的傳遞路徑和中間節點的處理過(guò)程(chéng)。
時間(jiān)軸和日誌視圖:通過在時間軸上展示跟蹤數據的時(shí)間戳和事件順序,可以更清晰地了解消息的傳遞順序和(hé)時間間隔。日(rì)誌視圖(tú)可以展示每個消息的詳細信息,包括消息內容、上下文和處理日誌等。
拓撲(pū)圖和依賴關係圖:使用拓撲圖工(gōng)具(如D3.js、Neo4j)可以繪製跟蹤數據的拓撲圖,展示服務之(zhī)間的關係和依賴。