Kafka消息格式及多版本支持
筆者所在的項目,需要往kafka內推送消息,供多方消費者使用。由于實際的Kafka服務端版本不一,且kafka不同版本的消息格式不同,因此java客戶端(發送消息/接收消息方,以下簡稱“客戶端”)的package下需要同時支持多個版本的Kafka。
Kafka消息格式
目前Kafka有三種消息格式,由于各個消息格式有不同的功能及性能特點,不同版本之間進行通信可能會導致發送或接受失敗,且會造成性能上的損失,因此服務端和客戶端的消息格式需要保持一致。
這里依據消息格式(magic),將具體支持的kafka版本大致分為三類:
| 消息格式 | 對應Kafka版本 | 描述 |
|---|---|---|
| v0 | 0.8~0.9 | 最早的消息格式 |
| v1 | 0.10.0.0~0.10.2.2 | 從0.10.0.0版本開始,增加了時間索引文件(0.10.1.0版KafkaConsumer開始提供offsetsForTimes接口,可根據時間戳消費數據 |
| v2 | 0.11.0.0~2.0+ | 0.11.0.0版本及以上的消息格式(magic)為v2;此范圍內的版本可以通過只配置Broker地址,實現topic的創建/刪除/修改。從2.0.0版本開始,后續的kafka版本放棄了對Java7的支持。因此,為了支持高版本kafka client,java的jdk版本需要升至1.8(0.9及后續版本均支持Java 8) |
客戶端版本劃分
想要支持0.9以上的所有版本的kafka服務端,只需要在客戶端引入三類消息格式的kafka包即可。
大專欄 Kafka消息格式及多版本支持 - 邊邊大神的博客
在0.10.1.0版本之前,Kafka服務器端和客戶端版本之間的兼容性是“單向”的,即高版本的broker可以處理低版本client的請求;
反過來,低版本的broker不能處理高版本client的請求。
0.10.1.0之前的v0和v1選擇當前范圍最小的版本,v2則隨機選擇任一版本即可。最終引入的三個客戶端版本為:0.9.0.0,0.10.0.0,2.1.0。
不過,這三個版本的包名及大部分類名是相同的,若直接在pom中引入,則java運行時將僅使用最高版本的包。
那么,如何解決同時支持多個版本的kafka客戶端呢?
java支持同名package的方法
同一java項目包內引入不同版本kafka client jar包的方法(此方法可引申至其他依賴包,不限于Kafka):
為每個kafka 依賴包創建一個maven項目,在pom文件中引入maven-shade-plugin插件,通過relocation將項目包名更改為新的名稱:
<relocation>
<pattern>org.apache.kafka</pattern>
<shadedPattern>test.kafka09</shadedPattern>
</relocation>
這樣,可以將0.9版本的org.apache.kafka重命名為ndc.kafka09,0.10版本的org.apache.kafka重命名為ndc.kafka10,以此類推。
java項目使用時,在pom文件中,將org.apache.kafka替換為test.kafka09;當java代碼中調用同一kafka接口時,可以通過不同的包名區分不同的實現版本。
總結
以上是生活随笔為你收集整理的Kafka消息格式及多版本支持的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基本机器学习面试问题 --- 理论/算法
- 下一篇: 椭圆形建筑——逸夫演艺中心