kafka offset 維護(hù)方式
zookeeper維護(hù)
- 使用zookeeper來維護(hù)offset
kafka 0.9 以前的版本是將offset 存儲在zookeeper上的芽偏,kafka在傳輸數(shù)據(jù)時辽故,數(shù)據(jù)消費(fèi)成功就會修改偏移量俊性,這樣就可以保證數(shù)據(jù)不會丟失而導(dǎo)致傳輸出錯;但是這也存在一個問題:那就是每次消費(fèi)數(shù)據(jù)時都要將數(shù)據(jù)的offset寫入一次项乒,效率比較低最盅,而且zookeeper與kafka的offset變化確認(rèn)也需要走網(wǎng)絡(luò)IO损搬,這樣就會給offset的維護(hù)帶來不穩(wěn)定性和低效。
kafka自己維護(hù)offset
- 使用broker來維護(hù)offset
kafka 0.9 以后盅粪,offset的使用了內(nèi)部的roker來管理斜做,這樣僅僅只需要broker,而不要zookeeper來維護(hù)湾揽,都是將topic提交給__consumer_offsets函數(shù)來執(zhí)行瓤逼。
high level 和low level
- 將zookeeper維護(hù)offset 的方式稱為 low level API
- 將kafka broker 維護(hù)offset的方式稱為high level API
使用high level API 更新offset具體設(shè)置
- 自動提交,設(shè)置enable.auto.commit=true库物,更新的頻率根據(jù)參數(shù)【auto.commit.interval.ms】來定霸旗。這種方式也被稱為【at most once】,fetch到消息后就可以更新offset戚揭,無論是否消費(fèi)成功诱告。
- 手動提交,設(shè)置enable.auto.commit=false民晒,這種方式稱為【at least once】精居。fetch到消息后,等消費(fèi)完成再調(diào)用方法【consumer.commitSync()】潜必,手動更新offset靴姿;如果消費(fèi)失敗,則offset也不會更新磁滚,此條消息會被重復(fù)消費(fèi)一次佛吓。