zipkin架構(gòu)

zipkin

Zipkin是一個(gè)分布式追蹤系統(tǒng)。它有助于收集解決微服務(wù)架構(gòu)中延遲問(wèn)題所需的時(shí)序數(shù)據(jù)。它管理這些數(shù)據(jù)的收集和查找。Zipkin的設(shè)計(jì)基于 Google Dapper論文。

image

架構(gòu)概述

追蹤器駐留在你的應(yīng)用程序里,并且記錄發(fā)生操作的時(shí)間和元數(shù)據(jù)。他們經(jīng)常裝配在庫(kù)上,所以對(duì)用戶來(lái)說(shuō)是透明的。舉個(gè)例子,一個(gè)裝配過(guò)的 Web 服務(wù)器,會(huì)在接收請(qǐng)求和發(fā)送響應(yīng)進(jìn)行記錄。收集的追蹤數(shù)據(jù)叫做 Span(跨度)。

生產(chǎn)環(huán)境中的裝配器應(yīng)該是安全并且低負(fù)載的。為此,帶內(nèi)(in-band)只傳輸 ID,并且告訴接收器仍有一個(gè)追蹤在處理。完成的跨度在帶外(out-of-band)匯報(bào)給 Zipkin,類似于應(yīng)用程序異步匯報(bào)指標(biāo)一樣。

舉個(gè)例子,當(dāng)追蹤一個(gè)操作的時(shí)候,該操作對(duì)外發(fā)送了一個(gè) HTTP 請(qǐng)求,那么,為了傳輸 ID 就會(huì)添加一些額外的頭部信息。頭部信息并不是用于發(fā)送像是操作明這樣的詳細(xì)信息的。

裝配應(yīng)用中用于向 Zipkin 發(fā)送數(shù)據(jù)的組件叫做 Reporter。Reporter 通過(guò) Transport 發(fā)送追蹤數(shù)據(jù)到 Zipkin 的 Collector,Collector 持久化數(shù)據(jù)到 Storage 中。之后,API 從 Storage 中查詢數(shù)據(jù)提供給 UI。

下面的圖表描述了整個(gè)流程:

image

示例流程

正如概述中所提到的,標(biāo)識(shí)符是在帶內(nèi)發(fā)送的,細(xì)節(jié)以帶外形式發(fā)送到Zipkin。在這兩種情況下,跟蹤工具都負(fù)責(zé)創(chuàng)建有效的痕跡并正確渲染它們。例如,跟蹤器可確保它在帶內(nèi)(下游)和帶外(向Zipkin異步)發(fā)送的數(shù)據(jù)之間進(jìn)行平衡。

以下是用戶代碼調(diào)用資源/ foo的http跟蹤示例序列。這會(huì)導(dǎo)致一個(gè)跨度,在用戶代碼收到http響應(yīng)后異步發(fā)送到Zipkin。


┌─────────────┐ ┌───────────────────────┐  ┌─────────────┐  ┌──────────────────┐
│ User Code   │ │ Trace Instrumentation │  │ Http Client │  │ Zipkin Collector │
└─────────────┘ └───────────────────────┘  └─────────────┘  └──────────────────┘
       │                 │                         │                 │
           ┌─────────┐
       │ ──┤GET /foo ├─? │ ────┐                   │                 │
           └─────────┘         │ record tags
       │                 │ ?───┘                   │                 │
                           ────┐
       │                 │     │ add trace headers │                 │
                           ?───┘
       │                 │ ────┐                   │                 │
                               │ record timestamp
       │                 │ ?───┘                   │                 │
                             ┌─────────────────┐
       │                 │ ──┤GET /foo         ├─? │                 │
                             │X-B3-TraceId: aa │     ────┐
       │                 │   │X-B3-SpanId: 6b  │   │     │           │
                             └─────────────────┘         │ invoke
       │                 │                         │     │ request   │
                                                         │
       │                 │                         │     │           │
                                 ┌────────┐          ?───┘
       │                 │ ?─────┤200 OK  ├─────── │                 │
                           ────┐ └────────┘
       │                 │     │ record duration   │                 │
            ┌────────┐     ?───┘
       │ ?──┤200 OK  ├── │                         │                 │
            └────────┘       ┌────────────────────────────────┐
       │                 │ ──┤ asynchronously report span     ├────? │
                             │                                │
                             │{                               │
                             │  "traceId": "aa",              │
                             │  "id": "6b",                   │
                             │  "name": "get",                │
                             │  "timestamp": 1483945573944000,│
                             │  "duration": 386000,           │
                             │  "annotations": [              │
                             │--snip--                        │
                             └────────────────────────────────┘

跟蹤檢測(cè)報(bào)告異步跨越,以防止與跟蹤系統(tǒng)相關(guān)的延遲或故障延遲或破壞用戶代碼。

Transport
裝配庫(kù)發(fā)送的跨度必須由裝配的服務(wù)傳輸?shù)?Collector。 有三種主要的傳輸類型:HTTP、Scribe 和 Kafka。更多信息查看跨度接收器。

共有四個(gè)組件構(gòu)成了 Zipkin:

  1. collector
  2. storage
  3. search
  4. web UI

Zipkin Collector

一旦追蹤數(shù)據(jù)抵達(dá) Zipkin Collector 守護(hù)進(jìn)程,Zipkin Collector 為了查詢,會(huì)對(duì)其進(jìn)行校驗(yàn)、存儲(chǔ)和索引。

Storage

Zipkin 最初是構(gòu)建在將數(shù)據(jù)存儲(chǔ)在 Cassandra 中,因?yàn)?Cassandra 易跨站,支持靈活的 schema,并且在 Twitter 內(nèi)部被大規(guī)模使用。然而,我們將這個(gè)組件做成了可插拔式的。在 Cassandra 之外,我們?cè)С?ElasticSearch 和 MySQL??勺鳛榈谌綌U(kuò)展提供給其它后端。

Zipkin 查詢服務(wù)

一旦數(shù)據(jù)被存儲(chǔ)索引,我們就需要一種方式提取它。查詢守護(hù)進(jìn)程提供了一個(gè)簡(jiǎn)單的 JSON API 查詢和獲取追蹤數(shù)據(jù)。API 的主要消費(fèi)者就是 Web UI。

Web UI

我們創(chuàng)建了一個(gè)用戶圖形界面為追蹤數(shù)據(jù)提供了一個(gè)漂亮的視圖。Web UI 提供了基于服務(wù)、時(shí)間和標(biāo)記(annotation)查看追中數(shù)據(jù)的方法。注意:UI 沒(méi)有內(nèi)置的身份認(rèn)證功能。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容