模式如何工作

如果訊息處理失敗,該訊息將被轉發到一個重試 topic,並帶有退避時間戳。然後,重試 topic 的 consumer 會檢查時間戳,如果時間未到,則暫停該 topic 分割槽的消費。當時間到達時,該分割槽消費將恢復,訊息被再次消費。如果訊息處理再次失敗,該訊息將被轉發到下一個重試 topic,此模式重複進行,直到處理成功,或者嘗試次數耗盡,並且(如果配置了)訊息被髮送到 Dead Letter Topic。

舉例來說,如果您有一個名為 "main-topic" 的 topic,並想設定一個非阻塞重試,其指數退避為 1000ms,乘數為 2,最大嘗試次數為 4,它將建立 main-topic-retry-1000、main-topic-retry-2000、main-topic-retry-4000 和 main-topic-dlt 這些 topic,並配置相應的 consumer。該框架還會負責建立這些 topic 以及設定和配置監聽器。

使用此策略會失去 Kafka 對該 topic 的順序保證。
您可以設定您偏好的 AckMode 模式,但建議使用 RECORD

當使用手動 AckModeasyncAcks 設定為 true 時,必須將 DefaultErrorHandler 配置為 seekAfterErrorfalse。從版本 2.9.10 和 3.0.8 開始,對於此類配置,這將被無條件地設定為 false。在更早的版本中,需要重寫 RetryTopicConfigurationSupport.configureCustomizers() 方法才能將該屬性設定為 false

@Override
protected void configureCustomizers(CustomizersConfigurer customizersConfigurer) {
    customizersConfigurer.customizeErrorHandler(eh -> eh.setSeekAfterError(false));
}

此外,在這些版本之前,使用預設的(日誌記錄)DLT handler 與任何型別的手動 AckMode 都不相容,無論 asyncAcks 屬性如何。