簡體   English   中英

做無限退休的kafka消費者如何從錯誤的傳入消息中恢復?

[英]How can a kafka consumer doing infinite retires recover from a bad incoming message?

我是kafka新手,在閱讀文檔時,我遇到了與kafka消費者有關的與設計相關的問題。

卡夫卡使用者從卡夫卡流中讀取消息,該流由一個或多個服務器的一個或多個分區組成。

可以說,傳入的消息之一已損壞,結果是使用者無法處理。 但是,在處理事件日志時,您不想刪除任何事件,因此您需要進行無限次重試,以避免在處理過程中出現瞬時錯誤。 在這種無限重試的情況下,消費者如何前進。 有沒有一種方法可以將此消息列入黑名單以供下次重試?

我認為它需要手動干預。 我們在哪里記錄一些消息元數據(尚不知道到底是什么)來查看哪條消息失敗,並有邏輯,每個消費者在n次綁定后檢查redis(或其他地方?)以查看是否需要跳過此消息。 黑名單也不必永遠存儲在Redis中,僅在消費者可以跳過之前就可以了。 這是我剛才描述的偽代碼:

while (errorState) {
       if (msg in blacklist) {
           //skip
           commitOffset()
       } else {      
            errorState = processMessage(msg);       
            if (!errorState) {
                 commitOffset();
            } else {
                 // log this msg so that we can add to blacklist
                 logger.info(msg)
            }
        }
}

我想聽聽經驗豐富的人的意見,看看是否有更好的方法可以做到這一點。

在項目中,我們有一個要求,即處理傳入消息以更新記錄取決於存在的記錄。 由於某些競爭條件,有時更新在插入之前到達。 在這種情況下,我們實施了兩種方法。

A.手動重試具有預定義的延遲。 該代碼檢查插入是否到達。 如果是這樣,則處理正常進行。 否則,它將休眠500ms,然后重試。 這將重復10次。 最后,如果仍未處理該消息,則代碼將記錄該消息,提交偏移量並向前移動。 消息的處理始終在池中的線​​程中完成,因此也不會阻塞主線程。 但是,在最壞的情況下,每條消息將花費5秒鍾的應用時間。

B.最近,我們改進了上述解決方案,以使用基於kafka的消息調度程序。 因此,現在,如果insert在更新之前尚未到達,系統會將其發送到在kafka上運行的單獨的調度程序。 此調度程序將在一段時間后重播該消息。 重試3次后,我們將再次記錄該消息,並停止計划或重試。 這給我們帶來的好處是,不阻塞應用程序線程,並在我們希望再次重播消息時進行管理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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