又是很久沒有寫技術文章了, 平時的東西會記錄在自己的本地, 比較友善; 但是搬上Blog的過程需要重新的總結和回顧甚至排版, 真沒有那麼多時間弄這些.
進入正題. Kafka從0.7版本到現在的0.10版本, 經曆了巨大的變化; 而其中, 首當其沖的是Consumer的機制.
Kafka最早設計Consumer的時候, 大方向比較明确, 就是同時支援Subscribe功能和Message Queue功能. 語義設計上很清晰,但是實作之後, 發現有一些問題. 主要問題集中在:
1 使用者希望自己能夠控制Offset的儲存和讀取;
0.8.0 SimpleConsumer Example
2 Offset儲存在Zookeeper中對Zookeeper帶來壓力較大, 需要脫離的ZK的依賴;
Committing and fetching consumer offsets in Kafka
Offset Management
https://issues.apache.org/jira/browse/KAFKA-657
3 使用者希望能獲得Offset并且自行決定儲存的位置;
4 使用者自己控制Offset時, 卻會陷入複雜的異常處理邏輯;
5 老的Consumer會有驚群效應和腦裂問題;
Consumer Client Re-Design
Consumer的改進直到0.9版本, 終于有了一個接近完美的版本; 但是由于向前相容的需要, 以前的Consumer方式正在被使用, 并沒有徹底移除. 由于Consumer的多版本存在, 并且個版本的Consumer變化很大, 這些影響又是對上層可見的, 是以對使用者造成了很大的混淆和困惑.
是以我想在這篇Blog中整理分析一下各Consumer的特點和差別, 讓大家有一個縱觀曆史的認識.