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。