Kafka MQ 消費者應用場景
1 消費者自動提交的時機
在 Kafka 中默認的消費位移的提交方式是自動提交,這個由消費者客戶端參數 enable.auto.commit
配置,默認值為 true。當然這個默認的自動提交不是每消費一條消息就提交一次,而是定期提交,這個定期的周期時間由客戶端參數 auto.commit.interval.ms
配置,默認值為5秒,此參數生效的前提是 enable.auto.commit
參數為true。在代碼清單3-1中并沒有展示出這兩個參數,說明使用的正是默認值。
在默認的方式下,消費者每隔5秒會將拉取到的每個分區中最大的消息位移進行提交。自動位移提交的動作是在poll(?)方法的邏輯里完成的,在每次真正向服務端發起拉取請求之前會檢查是否可以進行位移提交,如果可以,那么就會提交上一次輪詢的位移。
2 消息丟失的場景
按照一般思維邏輯而言,自動提交是延時提交,重復消費可以理解,那么消息丟失又是在什么情形下會發生的呢?我們來看下圖中的情形。
拉取線程A不斷地拉取消息并存入本地緩存,比如在BlockingQueue中,另一個處理線程B從緩存中讀取消息并進行相應的邏輯處理。假設目前進行到了第y+1次拉取,以及第m次位移提交的時候,也就是x+6之前的位移已經確認提交了,處理線程B卻還正在消費x+3的消息。此時如果處理線程B發生了異常,待其恢復之后會從第m此位移提交處,也就是x+6的位置開始拉取消息,那么x+3至x+6之間的消息就沒有得到相應的