[英]How & when the Kafka message will be redelivered if manual acknowledgment not sent due to error processing the message at consumer ?
[英]Reconsume Kafka Message that failed during processing due to DB error
我是 Kafka 的新手,想就處理這種情況的最佳實踐尋求建議。
設想:
我有一個 spring 啟動應用程序,它有一個消費者方法,該方法通過@KafkaListner
注釋偵聽消息。 一旦傳入消息發生,消費者方法將處理該消息,它只是通過JdbcTemplate
對不同的表執行數據庫更新。
如果表更新成功,我將通過調用acknowledge()
方法手動提交消息。 如果數據庫更新失敗,我將不調用acknowledge()
方法,而是在給定的持續時間(例如 10 秒)內調用nack()
方法,這樣消息將再次出現以供使用。
注意事項
這是問題所在
如果我執行上述方法,我的消費者就會變得不一致。 假設我以 1 分鍾的持續時間調用nack()
方法,也就是說 1 分鍾后,相同的消息將再次出現。
在這 1 分鍾內,可以使用和處理“x”條傳入消息。 所做的觀察是這些消息都沒有被消耗和處理。
我想知道什么
因此,我希望有人會告訴我我做錯了什么,以及處理此類情況的最佳實踐/方法是什么。
謝謝!
記錄總是按順序接收; 沒有辦法將當前記錄推遲到以后,但在從單個主題消費時繼續處理此記錄之后的其他記錄。
Kafka 主題是線性日志而不是隊列。
您需要將其發送到另一個主題; @RetryableTopic
(非阻塞重試)特性是專門為這個用例設計的。
https://docs.spring.io/spring-kafka/docs/current/reference/html/#retry-topic
您還可以增加容器並發性,這樣至少您可以繼續處理來自其他分區的記錄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.