捋一捋Kafka中的消費者API

       之前學習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消息日誌還沒有被刪除)消費
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章