之前學習kafka的時候,知道kafka有新的consumer和舊的consumer,還有高階consumer API,低階consumer API,搞得一頭霧水,不知道他們之間的關係。今天在這兒捋一捋他們的關係。
Kafka在0.8.2.x版本中用java語言重寫了producer,在0.9.0.x版本中用java重寫了consumer,舊的都是scala語言編寫的。今天在這兒只說說consumer吧。
Kafka的高階消費者(high-level consumer)和低階消費者(low-level consumer,底層用SimpleConsumer實現)是舊版本的consumer中的。新版本的consumer中沒有這兩個概念。新版本把高階消費者和低階消費者整合到一起了,分別對應KafkaConsumer類的subscribe和assign方法。新舊版本的consumer差別還是很多的,一言難盡。
下面來總結一下新舊消費者的主要區別:
屬性 | 新版本 | 舊版本 |
---|---|---|
編程語言 | Java | Scala |
客戶端(Kafka消費者、生產者相對於服務端broker來說都是客戶端)所在包 | org.apache.kafka.clients.* | kafka.consumer.* |
消費者是否依賴ZooKeeper | 否 | 是 |
消費者組的消費進度offset保存位置 | 內部的topic __consumer_offsets中(有compact機制,只會保存最新的消費進度,不用擔心消費記錄佔用空間) | ZooKeeper(當消費頻繁時需要頻繁寫zk,zk不適合用作頻繁寫的場景) |
消費者組管理 | 由某個broker擔任消費組的協調者coordinator,使得消費組成員變化不用依靠zk來管理,進一步解耦zk | 依賴zk管理 |
舊版本的消費者:
屬性 | 高階API | 低階API |
---|---|---|
是否有消費者組 | 有(多個消費者組成一個組,彼此之間有關聯) | 無(單獨的消費者,與其他消費者沒有關係) |
優缺點 | 死板省事 | 靈活麻煩 |
使用範圍 | 一般的開發場景 | 需要靈活性的第三方框架,比如Apache-storm的Kafka插件storm-kafka。 需要反覆消費歷史數據的場景。 只想消費部分分區的數據。 需要精確實現處理一次(exactly-once,可以通過把位移提交和數據處理放入一個事務中實現)。 |
消費的offset選擇 | 只能從上次消費的地方接着消費(除非自己去重置消費位移) | 可以從分區任意位置(前提是kafka消息日誌還沒有被刪除)消費 |