在 海邊的 Kafka 與 Python 系列文章中,有提到關於 Consumer commit 的概念與實作,不過沒有提到一個重要的 Consumer 設定 auto.offset.reset
。
auto.offset.reset
有 3 種設定:
latest
earliest
none
上述 3 項設定在以下 2 種情況的 Consumer 會有不同的行為:
- 沒有任何 commit 的 Consumer (e.g. 剛加入且有新群組名稱的 consumer)
- 已有 commit 的 Consumer (e.g. 因故重新啟動的 consumer)
latest
沒有任何 commit 的 Consumer 使用 latest
的設定時, Kafka 會直接給 Consumer 最新 1 則的訊息(message) 。
已有 commit 的 Consumer, Kafka 則會從已 commit 之後的訊息開始派送給 Consumer 。
earliest
沒有任何 commit 的 Consumer 使用 earliest
的設定時, Kafka 會從訊息佇列(message queue)最舊的訊息開始派送給 Consumer 。
已有 commit 的 Consumer, Kafka 則會從已 commit 之後的訊息開始派送給 Consumer 。
none
沒有任何 commit 的 Consumer 使用 none
的設定時, Consumer 就會直接拋出 exception 。
已有 commit 的 Consumer, Kafka 則會從已 commit 之後的訊息開始派送給 Consumer 。
總結
如果 consumer 是需要從最早的訊息開始消化的情況,建議使用 earliest
。
如果不需要,則使用 latest
即可。
References
https://kafka.apache.org/documentation/