Consumer經過提交Offset來記錄當前消費的最後位置,以便於消費者發生崩潰或者有新的消費者加入消費者組,而引起的分區再均衡操做,每一個消費者可能會分到不一樣的分區。我測試的kafka版本是:0.11.0.2,消費者往一個特殊的主題「_consumer_offset」發送消息,如圖: 異步
消息的內容包括:測試
fields | content |
---|---|
Key | Consumer Group, topic, partition |
Payload | Offset, metadata, timestamp |
提交到「_consumer_offset」主題的消息會根據消費組的key進行分區,一個消費組內的全部消息,都會發送到惟一的Partition。 blog
Offset的提交邏輯其實和普通的生產者往kafka發送數據是同樣的。接口
消費者啓動時會爲「_consumer_offset」主題建立一個內置的生產者,用於Offset數據的提交。kafka
就是將Offset提交當成是正常的生產請求,邏輯不變。 同步
「_consumer_offset」主題會在集羣中的第一個Offset提交請求時被自動建立。it
Offset提交時會有兩個問題:重複消費和漏消費。io
根據具體的業務狀況,選擇合適的提交方式,能夠有效的解決掉重複消費和漏消費的問題。table
自動提交是最簡單的提交方式,經過設置參數,能夠開啓自動提交也能夠設置提交的時間間隔。缺點就是,當消費了一些數據後,還未達到自動的提交時間,這個時候,有新的消費者加入,或者當前消費者掛掉,會出現分區再均衡操做,以後消費者從新在上一次提交的Offset開始消費,形成重複消費。雖然能夠縮短自動提交間隔,可是仍是沒法解決這個問題。集羣
關閉手動提交,能夠經過同步提交接口來提交當前的Offset,雖然能夠獲取主動性,可是也犧牲了吞吐量,由於同步提交必然是阻塞的,並且會有重試機制。
使用異步提交方式,既有主動性,也能夠增長kafka消費的吞吐量,沒有重試機制,也解決不掉重複消費的問題。
正常使用的時候使用異步提交,速度快。當要關閉消費者的時候,使用同步提交,即便失敗了也會一直重試,直到提交成功或者發生沒法恢復的錯誤。無論是同步提交仍是異步提交都避免不了重複消費和漏消費的問題。
由於自動提交、同步提交與異步提交都是將最後一個Offset提交上去。經過提交指定的Offset,能夠減輕重複消費和漏消費的問題,可是相應的消費端就須要複雜的業務處理,並且須要本身維護Offset。