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

架構(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è)流程:

示例流程
正如概述中所提到的,標(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:
- collector
- storage
- search
- 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)證功能。