模式運作方式

如果訊息處理失敗,訊息會被轉發到一個重試主題,並帶有一個退避時間戳記。重試主題的消費者接著會檢查時間戳記,如果時間還沒到,它會暫停該主題分割區的消費。當時間到了,分割區消費會恢復,訊息會再次被消費。如果訊息處理再次失敗,訊息將會被轉發到下一個重試主題,並且重複這個模式,直到成功處理發生,或者嘗試次數耗盡,訊息被送到死信主題(如果已設定)。

為了說明,如果您有一個 "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 必須設定 seekAfterErrorfalse。從 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 屬性為何。