在Kafka 0.10.2.0之前,Kafka服務器端和客戶端版本之間的兼容性是“單向”的,即高版本的broker可以處理低版本client的請求。反過來,低版本的broker不能處理高版本client的請求。由於升級client要遠比升級broker簡單得多,因此這個限制給很多用戶帶來了麻煩,甚至有很多人都不願意去升級broker版本——畢竟無downtime的情況下正確升級Kafka服務器是個不小的挑戰。
自0.10.2.0版本開始,社區對這個問題進行了優化——對於低版本broker + 高版本client(0.10.2.0)的環境而言,現在用戶可以運行命令先查看當前broker支持的協議版本,然后再選擇broker支持的最高版本封裝請求即可。命令格式如下(在client端運行該命令):
bin/kafka-broker-api-version.sh --bootstrap-server localhost:9092
下面兩張圖分別表示查看0.10.2.0和0.10.0.1的broker所支持各協議的版本范圍,注意我標紅了FETCH請求以示區別:
左邊的圖連接的是0.10.2.0版本的broker,可以看到該版本的Kafka服務器支持的FETCH請求版本范圍是0到3,默認使用3;而右邊的圖連入的是0.10.0.1的Kafka,它只支持0~2版本的FETCH請求。因此你在編寫客戶端程序時需要根據這張表來確認broker支持的請求的最高版本,這樣就間接實現了“低broker處理高client請求”的兼容性目標。
考慮到Java版本的client已經被廣大用戶直接使用了,社區也改寫了Java clients底層的網絡客戶端代碼,里面會自動地判斷連接的broker端所支持client請求的最高版本,並自動創建合乎標准的請求。因此,對於FETCH請求和PRODUCE請求而言, 用戶不用擔心需要自己實現這些細節。
總之,自0.10.2.0之后用戶可以簡單地升級client端代碼到這個版本就可以很容易地實現與低版本Kafka服務器的交互了。