Apache Kafka消息格式的演变(0.7.x~0.10.x)
用 Kafka 這么久,從來都沒去了解 Kafka 消息的格式。今天特意去網(wǎng)上搜索了以下,發(fā)現(xiàn)這方面的資料真少,很多資料都是官方文檔的翻譯;而且 Kafka 消息支持壓縮,對于壓縮消息的格式的介紹更少。基于此,本文將以圖文模式介紹 Kafka 0.7.x、0.8.x 以及 0.10.x 等版本 Message 格式,因?yàn)?Kafka 0.9.x 版本的消息格式和 0.8.x 一樣,我就不單獨(dú)介紹了。
設(shè)計(jì)良好的消息格式應(yīng)該很容易支持版本的升級,并且新版本消息格式兼容老版本消息格式。現(xiàn)在我們就來看看 Kafka 消息格式是如何設(shè)計(jì)的。
Kafka 0.7.x 消息格式
這個(gè)版本消息的格式相對簡單,具體如下:
從上面可以看出,Kafka 0.7.x 版本的消息格式比較簡單,主要包括:
?magic:這個(gè)占用1個(gè)字節(jié),主要用于標(biāo)識 Kafka 版本。這個(gè)版本的 Kafka magic有 0 和 1 兩個(gè)值,不過默認(rèn) Message 使用的是 1;
?attributes:占用1個(gè)字節(jié),這里面存儲了消息壓縮使用的編碼。這個(gè)版本的 Kafka 僅支持 gzip 和 snappy 兩種壓縮格式;后四位如果是0001則標(biāo)識gzip壓縮,如果是0010則是snappy壓縮,如果是0000則表示沒有使用壓縮。
?crc:占用4個(gè)字節(jié),主要用于校驗(yàn)消息的內(nèi)容,也就是上圖的Value。
?value:這個(gè)占用的字節(jié)為 N - 6,N為Message總字節(jié)數(shù),6就是前面幾個(gè)屬性占用的字節(jié)和。value即是消息的真實(shí)內(nèi)容,在 Kafka 中這個(gè)也叫做payload。
大家在上圖還看到 MessageSet 的格式,一個(gè) MessageSet 包含多條消息,其中:
?offset:占用8個(gè)字節(jié),這個(gè)是 Kafka 消息存儲到磁盤之后的物理偏移量;
?size:占用4個(gè)字節(jié),這是消息的大小。
?message:占用N個(gè)字節(jié),這個(gè)就是上圖的Message,格式見Message Format。
需要注意的是, Kafka 從 Producer 發(fā)送到 Broker 是以 MessageSet 為單位發(fā)送的,而不是以 Message 發(fā)送的。而且壓縮的時(shí)候也是以 MessageSet 進(jìn)行壓縮的,并不是只壓縮一條消息,這樣做的目的是提高效率。壓縮之后的消息格式如下:
從上圖可以看出,壓縮之后的內(nèi)容作為另外一條消息的內(nèi)容進(jìn)行存儲,其中包含了多條消息。
Kafka 0.8.x (0.9.x) 消息格式
到了Kafka 0.8.0,消息格式變化了,相對于Kafka 0.7.x加入了幾個(gè)字段,主要如下:
這個(gè)版本的 Message 格式加入了 Key 相關(guān)的信息,以及 內(nèi)容的長度等,各個(gè)字段的含義介紹如下:
?crc:占用4個(gè)字節(jié),主要用于校驗(yàn)消息的內(nèi)容;
?magic:這個(gè)占用1個(gè)字節(jié),主要用于標(biāo)識 Kafka 版本。
?attributes:占用1個(gè)字節(jié),這里面存儲了消息壓縮使用的編碼。這個(gè)版本的 Kafka 僅支持 gzip、snappy 以及 lz4(0.8.2引入) 三種壓縮格式;后四位如果是0001則標(biāo)識gzip壓縮,如果是0010則是snappy壓縮,如果是0011則是snappy壓縮,如果是0000則表示沒有使用壓縮。
?key length:占用4個(gè)字節(jié)。主要標(biāo)識 Key 的內(nèi)容的長度 K;
?key:占用 K 個(gè)字節(jié)。存儲的是 key 的具體內(nèi)容
?value length:占用4個(gè)字節(jié)。主要標(biāo)識 value 的內(nèi)容的長度 V;
?value:這個(gè)占用的字節(jié)為 V。value即是消息的真實(shí)內(nèi)容,在 Kafka 中這個(gè)也叫做payload。
這個(gè)版本的MessageSet 格式和之前一樣,就不介紹了。但是需要注意的是,這個(gè)版本 MessageSet 中的 offset 字段存儲的已經(jīng)不是消息物理偏移量了,而是邏輯地址,比如0,、1、2…
我們在上面說了 Kafka 壓縮的時(shí)候是將整個(gè) MessageSet 進(jìn)行壓縮的,壓縮完之后的內(nèi)容作為另外一個(gè) Message 的 value,如下:
從上圖看到,壓縮消息的格式和非壓縮格式的消息不一樣,少了 Key 的存儲空間,而且這時(shí)候消息的 value 為壓縮之后的消息內(nèi)容。
Kafka 0.10.x 消息格式
到了Kafka 0.10.x,其引入了 Kafka Stream,其依賴了消息的時(shí)間,所有這個(gè)版本的消息加入了時(shí)間戳屬性,格式如下:
可以看出,這個(gè)版本相對于 Kafka 0.8.x版本的消息格式變化不大,各個(gè)字段的含義:
這個(gè)版本的 Message 格式加入了 Key 相關(guān)的信息,以及 內(nèi)容的長度等,各個(gè)字段的含義介紹如下:
?crc:占用4個(gè)字節(jié),主要用于校驗(yàn)消息的內(nèi)容;
?magic:這個(gè)占用1個(gè)字節(jié),主要用于標(biāo)識 Kafka 版本。Kafka 0.10.x magic默認(rèn)值為1
?attributes:占用1個(gè)字節(jié),這里面存儲了消息壓縮使用的編碼以及Timestamp類型。這個(gè)版本的 Kafka 僅支持 gzip、snappy 以及 lz4(0.8.2引入) 三種壓縮格式;后四位如果是0001則標(biāo)識gzip壓縮,如果是0010則是snappy壓縮,如果是0011則是snappy壓縮,如果是0000則表示沒有使用壓縮。第4個(gè)bit如果為0,代表使用create time;如果為1代表append time;其余位(第5~8位)保留;
?key length:占用4個(gè)字節(jié)。主要標(biāo)識 Key 的內(nèi)容的長度 K;
?key:占用 K 個(gè)字節(jié)。存儲的是 key 的具體內(nèi)容
?value length:占用4個(gè)字節(jié)。主要標(biāo)識 value 的內(nèi)容的長度 V;
?value:這個(gè)占用的字節(jié)為 V。value即是消息的真實(shí)內(nèi)容,在 Kafka 中這個(gè)也叫做payload。
這個(gè)版本的壓縮消息格式和 Kafka 0.8.x 類似,就不介紹了。
目前的 Kafka 最新版本為 0.11.x,這個(gè)版本相對于之前版本有了重大的改變,消息格式完全變了。由于其還在開發(fā)中,本文就不再介紹了,如果大家感興趣,可以到官方文檔進(jìn)行閱讀。
總結(jié)
以上是生活随笔為你收集整理的Apache Kafka消息格式的演变(0.7.x~0.10.x)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 武警退伍可以专升本吗
- 下一篇: ElasticSearch技术文档