模式運作方式
如果訊息處理失敗,訊息會被轉發到一個重試主題,並帶有一個退避時間戳記。重試主題的消費者接著會檢查時間戳記,如果時間還沒到,它會暫停該主題分割區的消費。當時間到了,分割區消費會恢復,訊息會再次被消費。如果訊息處理再次失敗,訊息將會被轉發到下一個重試主題,並且重複這個模式,直到成功處理發生,或者嘗試次數耗盡,訊息被送到死信主題(如果已設定)。
為了說明,如果您有一個 "main-topic" 主題,並且想要設定非阻塞重試,指數退避為 1000 毫秒,倍數為 2,最大嘗試次數為 4 次,它將會建立 main-topic-retry-1000、main-topic-retry-2000、main-topic-retry-4000 和 main-topic-dlt 主題,並設定各自的消費者。框架也會負責建立主題以及設定和組態監聽器。
透過使用此策略,您會失去 Kafka 對該主題的順序保證。 |
您可以設定您偏好的 AckMode 模式,但建議使用 RECORD 。 |
目前此功能不支援類別層級的 @KafkaListener 註解。 |
當使用手動 AckMode
並將 asyncAcks
設定為 true 時,DefaultErrorHandler
必須設定 seekAfterError
為 false
。從 2.9.10、3.0.8 版本開始,對於此類組態,這將無條件設定為 false
。在較早版本中,需要覆寫 RetryConfigurationSupport.configureCustomizers()
方法來將屬性設定為 false
。
@Override
protected void configureCustomizers(CustomizersConfigurer customizersConfigurer) {
customizersConfigurer.customizeErrorHandler(eh -> eh.setSeekAfterError(false));
}
此外,在這些版本之前,使用預設(日誌記錄)DLT 處理器與任何類型的手動 AckMode
都不相容,無論 asyncAcks
屬性為何。