consumer在消費時,會設定從哪裡開始消費。
預設是CONSUME_FROM_LAST_OFFSET
設定的值如代碼所示。
public enum ConsumeFromWhere {
/**
* 一個新的訂閱組第一次啟動從隊列的最後位置開始消費<br>
* 後續再啟動接着上次消費的進度開始消費
*/
CONSUME_FROM_LAST_OFFSET,
@Deprecated
CONSUME_FROM_LAST_OFFSET_AND_FROM_MIN_WHEN_BOOT_FIRST,
@Deprecated
CONSUME_FROM_MIN_OFFSET,
@Deprecated
CONSUME_FROM_MAX_OFFSET,
/**
* 一個新的訂閱組第一次啟動從隊列的最前位置開始消費<br>
* 後續再啟動接着上次消費的進度開始消費
*/
CONSUME_FROM_FIRST_OFFSET,
/**
* 一個新的訂閱組第一次啟動從指定時間點開始消費<br>
* 後續再啟動接着上次消費的進度開始消費<br>
* 時間點設定參見DefaultMQPushConsumer.consumeTimestamp參數
*/
CONSUME_FROM_TIMESTAMP,
}
這裡要注意代碼注釋。這個參數隻對一個新的consumeGroup第一次啟動時有效。
就是說,如果是一個consumerGroup重新開機,他隻會從自己上次消費到的offset,繼續消費。這個參數是沒用的。 而判斷是不是一個新的ConsumerGroup是在broker端判斷。
要知道,消費到哪個offset最先是存在Consumer本地的,定時和broker同步自己的消費offset。broker在判斷是不是一個新的consumergroup,就是查broker端有沒有這個consumergroup的offset記錄。
另外,對于一個新的queue,這個參數也是沒用的,都是從0開始消費。
是以,讓我們困惑的一個問題我已經設定了CONSUME_FROM_LAST_OFFSET,為什麼還是重複消費了。
可能你這不是新的consumergroup,也可能是個新的Queue。