日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Apache Kafka消息格式的演变(0.7.x~0.10.x)

發布時間:2024/9/27 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Apache Kafka消息格式的演变(0.7.x~0.10.x) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

用 Kafka 這么久,從來都沒去了解 Kafka 消息的格式。今天特意去網上搜索了以下,發現這方面的資料真少,很多資料都是官方文檔的翻譯;而且 Kafka 消息支持壓縮,對于壓縮消息的格式的介紹更少。基于此,本文將以圖文模式介紹 Kafka 0.7.x、0.8.x 以及 0.10.x 等版本 Message 格式,因為 Kafka 0.9.x 版本的消息格式和 0.8.x 一樣,我就不單獨介紹了。

設計良好的消息格式應該很容易支持版本的升級,并且新版本消息格式兼容老版本消息格式。現在我們就來看看 Kafka 消息格式是如何設計的。

Kafka 0.7.x 消息格式

這個版本消息的格式相對簡單,具體如下:

從上面可以看出,Kafka 0.7.x 版本的消息格式比較簡單,主要包括:
?magic:這個占用1個字節,主要用于標識 Kafka 版本。這個版本的 Kafka magic有 0 和 1 兩個值,不過默認 Message 使用的是 1;
?attributes:占用1個字節,這里面存儲了消息壓縮使用的編碼。這個版本的 Kafka 僅支持 gzip 和 snappy 兩種壓縮格式;后四位如果是0001則標識gzip壓縮,如果是0010則是snappy壓縮,如果是0000則表示沒有使用壓縮。
?crc:占用4個字節,主要用于校驗消息的內容,也就是上圖的Value。
?value:這個占用的字節為 N - 6,N為Message總字節數,6就是前面幾個屬性占用的字節和。value即是消息的真實內容,在 Kafka 中這個也叫做payload。

大家在上圖還看到 MessageSet 的格式,一個 MessageSet 包含多條消息,其中:
?offset:占用8個字節,這個是 Kafka 消息存儲到磁盤之后的物理偏移量;
?size:占用4個字節,這是消息的大小。
?message:占用N個字節,這個就是上圖的Message,格式見Message Format。

需要注意的是, Kafka 從 Producer 發送到 Broker 是以 MessageSet 為單位發送的,而不是以 Message 發送的。而且壓縮的時候也是以 MessageSet 進行壓縮的,并不是只壓縮一條消息,這樣做的目的是提高效率。壓縮之后的消息格式如下:

從上圖可以看出,壓縮之后的內容作為另外一條消息的內容進行存儲,其中包含了多條消息。

Kafka 0.8.x (0.9.x) 消息格式

到了Kafka 0.8.0,消息格式變化了,相對于Kafka 0.7.x加入了幾個字段,主要如下:

這個版本的 Message 格式加入了 Key 相關的信息,以及 內容的長度等,各個字段的含義介紹如下:
?crc:占用4個字節,主要用于校驗消息的內容;
?magic:這個占用1個字節,主要用于標識 Kafka 版本。
?attributes:占用1個字節,這里面存儲了消息壓縮使用的編碼。這個版本的 Kafka 僅支持 gzip、snappy 以及 lz4(0.8.2引入) 三種壓縮格式;后四位如果是0001則標識gzip壓縮,如果是0010則是snappy壓縮,如果是0011則是snappy壓縮,如果是0000則表示沒有使用壓縮。
?key length:占用4個字節。主要標識 Key 的內容的長度 K;
?key:占用 K 個字節。存儲的是 key 的具體內容
?value length:占用4個字節。主要標識 value 的內容的長度 V;
?value:這個占用的字節為 V。value即是消息的真實內容,在 Kafka 中這個也叫做payload。

這個版本的MessageSet 格式和之前一樣,就不介紹了。但是需要注意的是,這個版本 MessageSet 中的 offset 字段存儲的已經不是消息物理偏移量了,而是邏輯地址,比如0,、1、2…

我們在上面說了 Kafka 壓縮的時候是將整個 MessageSet 進行壓縮的,壓縮完之后的內容作為另外一個 Message 的 value,如下:

從上圖看到,壓縮消息的格式和非壓縮格式的消息不一樣,少了 Key 的存儲空間,而且這時候消息的 value 為壓縮之后的消息內容。

Kafka 0.10.x 消息格式

到了Kafka 0.10.x,其引入了 Kafka Stream,其依賴了消息的時間,所有這個版本的消息加入了時間戳屬性,格式如下:

可以看出,這個版本相對于 Kafka 0.8.x版本的消息格式變化不大,各個字段的含義:
這個版本的 Message 格式加入了 Key 相關的信息,以及 內容的長度等,各個字段的含義介紹如下:
?crc:占用4個字節,主要用于校驗消息的內容;
?magic:這個占用1個字節,主要用于標識 Kafka 版本。Kafka 0.10.x magic默認值為1
?attributes:占用1個字節,這里面存儲了消息壓縮使用的編碼以及Timestamp類型。這個版本的 Kafka 僅支持 gzip、snappy 以及 lz4(0.8.2引入) 三種壓縮格式;后四位如果是0001則標識gzip壓縮,如果是0010則是snappy壓縮,如果是0011則是snappy壓縮,如果是0000則表示沒有使用壓縮。第4個bit如果為0,代表使用create time;如果為1代表append time;其余位(第5~8位)保留;
?key length:占用4個字節。主要標識 Key 的內容的長度 K;
?key:占用 K 個字節。存儲的是 key 的具體內容
?value length:占用4個字節。主要標識 value 的內容的長度 V;
?value:這個占用的字節為 V。value即是消息的真實內容,在 Kafka 中這個也叫做payload。

這個版本的壓縮消息格式和 Kafka 0.8.x 類似,就不介紹了。

目前的 Kafka 最新版本為 0.11.x,這個版本相對于之前版本有了重大的改變,消息格式完全變了。由于其還在開發中,本文就不再介紹了,如果大家感興趣,可以到官方文檔進行閱讀。

總結

以上是生活随笔為你收集整理的Apache Kafka消息格式的演变(0.7.x~0.10.x)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。