簡體   English   中英

重新消費由於數據庫錯誤而在處理過程中失敗的 Kafka 消息

[英]Reconsume Kafka Message that failed during processing due to DB error

我是 Kafka 的新手,想就處理這種情況的最佳實踐尋求建議。

設想:

我有一個 spring 啟動應用程序,它有一個消費者方法,該方法通過@KafkaListner注釋偵聽消息。 一旦傳入消息發生,消費者方法將處理該消息,它只是通過JdbcTemplate對不同的表執行數據庫更新。

如果表更新成功,我將通過調用acknowledge()方法手動提交消息。 如果數據庫更新失敗,我將不調用acknowledge()方法,而是在給定的持續時間(例如 10 秒)內調用nack()方法,這樣消息將再次出現以供使用。

注意事項

  1. 我不關心消息的順序。 無論發生什么事件,我只需要消費和處理它,僅此而已。
  2. 我只得到一個主題(沒有可重試的主題,也沒有死信主題)

這是問題所在

如果我執行上述方法,我的消費者就會變得不一致。 假設我以 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM