成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring實現Kafka重試Topic,真的太香了

開發 架構
雖然使用 RetryableTopic 的異步處理優勢為我們帶來了性能提升,但這種使用也有一些缺點。使用RetryableTopic可能會破壞消息的處理順序。

概述

Kafka的強大功能之一是每個分區都有一個Consumer的偏移值。該偏移值是消費者將讀取的下一條消息的值。可以自動或手動增加該值。如果我們由于錯誤而無法處理消息并想重試,我們可以選擇手動管理,并在成功的情況下增加偏移量。但是,這會暫時阻止隊列消息的處理。我們可以選擇異步方法。

為什么我們需要它?

如果發生錯誤,而不是停止隊列消息的處理;我們可以將錯誤消息轉移到不同的主題并再次處理。

如果在處理 Kafka 消息時出現錯誤,可以使用 RetryableTopic 注解以一定的時間間隔和一定的次數再次處理消息。如果完成嘗試次數后錯誤仍然存在,則消息將發送到 DLT 隊列。

如何使用?

我們首先回顧一下RetryableTopic注解可以取的一些值,以便您可以做出最適合您的設置:

attempts:嘗試處理消息的次數。它的默認值為 3。如果完成所有嘗試后仍然收到錯誤,則消息將發送到 DLT 隊列。

backoff:用于確定處理消息的時間間隔。從 Backoff 類獲取一個值。您可以在下面找到退避的詳細示例。

排除/排除名稱:允許您排除指定的異常類。當您添加到列表中的任何錯誤被拋出時,重試機制將不會被激活。

include / includeNames:僅當拋出指定的異常時才會激活重試機制。

kafkaTemplate:雖然您可以給出現有 kafkaTemplate bean 的名稱,但您也可以為特定于重試的 Kafka 模板定義不同的 bean。

autoCreateTopics:決定是否自動創建Retry和DLT主題。

retryTopicSuffix / dltTopicSuffix:用于確定要添加到自動創建的主題末尾的后綴。

dltStrategy:如果不需要DLT,可以定義為NO_DLT。

SameIntervalTopicReuseStrategy/fixedDelayTopicStrategy(3.0.4之前):用于確定要創建的重試主題策略。創建 (SINGLE_TOPIC) 或盡可能多的嘗試值 (MULTIPLE_TOPICS) 重試主題。

Backoff的示例:

  • 具有固定的增量值
Backoff(delay = 600000 ) // 每 10 分鐘
  • 具有指數價值
Backoff(delay = 60000 , multiplier = 2 ) // 1、2、4、8... 分鐘后重復。
  • 用占位符定義值
Backoff(delayExpression = "${delay}", multiplierExpression = "${multiplier}")

@RetryableTopic 示例:

@RetryableTopic(
     backoff = @Backoff(delay = 300000),
     attempts = 12,
     sameIntervalTopicReuseStrategy = 
         SameIntervalTopicReuseStrategy.SINGLE_TOPIC,
     kafkaTemplate = "kafkaRetryableTopicTemplate",
     exclude = { SerializationException.class, 
                 DeserializationException.class, 
                 NullPointerException.class 
               }
 )
 @KafkaListener(topics = "my-topic")
 public void processMessage(RetryableDto retryableDto) {
     log.info("Retrying process RetryableDto : {}", retryableDto);
     // process message
 }

在上面的例子中,消息將每5分鐘重新處理一次,總共12次,即1小時。如果任何嘗試均順利完成,則試用將終止。

由于定義了 SINGLE_TOPIC,因此將創建單個主題以進行重試。如果沒有進行此定義,則會創建 12 個重試主題。

如果拋出了排除中定義的任何錯誤,則不會執行重做。

如果需要,您可以編寫自己的 RetryableException 并在包含中定義此值,以便僅在引發此錯誤時才重試。

DLT隊列處理

如果完成了定義的嘗試次數并且繼續收到錯誤,則消息將發送到 DLT 隊列。如果要處理這些消息,可以使用DltHandler注解。

用法示例:

@DltHandler 
 public  void  handleDltMessage (RetryableDto retryableDto) { 
     log.error("DLT處理程序消息:{}", retryableDto); 
}

注意事項

雖然使用 RetryableTopic 的異步處理優勢為我們帶來了性能提升,但這種使用也有一些缺點。

使用RetryableTopic可能會破壞消息的處理順序。

讓我們用一個例子來解釋這種情況:當主主題在時間 t 處理時,一條消息出錯并被發送到重試主題。在時間 t + 1 時,另一條消息來到主主題并成功處理。讓我們在重試主題中的消息在時間 t + 2 時被成功處理。在這種情況下,第一條傳入消息將在第二條消息之后處理。如果訂購對您很重要,我建議您在消息處理過程中進行必要的檢查。

另一個缺點是消息雙重處理的風險。您可以通過考慮這種可能性來進行改進。

責任編輯:武曉燕 來源: HELLO程序員
相關推薦

2024-01-05 13:26:00

KafkaTopicSpring

2023-11-09 08:01:41

Spring緩存注解

2021-01-11 08:03:30

阿里中臺項目

2020-10-10 11:07:38

Java開發代碼

2023-11-07 10:36:37

2021-07-28 14:20:13

正則PythonFlashText

2020-12-21 07:36:15

緩存數據庫緩存層

2023-11-13 22:47:58

PythonPathlib

2025-01-09 11:24:59

線程池美團動態配置中心

2023-02-08 16:56:07

2024-08-09 08:55:43

if執行器版本

2021-04-26 07:31:22

SpringMVCweb框架

2015-01-08 15:44:58

物聯網

2021-08-03 05:22:49

微信借條騰訊

2022-11-14 08:19:59

重試機制Kafka

2024-08-09 08:46:00

Springjar 包YAML

2020-12-02 16:40:00

微信新功能移動應用

2020-12-28 11:09:40

Python正則表達式代碼

2024-12-27 09:12:12

C++17代碼元組
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区二区免费 | 日本在线网站 | 99久久精品国产毛片 | 中文字幕久久精品 | 91超碰在线 | 中文字幕在线免费观看 | 91国产视频在线观看 | 一级a性色生活片久久毛片 一级特黄a大片 | 蜜臀网 | 九九成人 | 免费观看一级视频 | 国产精品成人一区二区三区夜夜夜 | 久久三级影院 | 成人黄色在线视频 | 免费视频中文字幕 | 欧美日韩18| 一二三在线视频 | 亚洲精品欧美精品 | 午夜精品一区二区三区在线观看 | 成人精品鲁一区一区二区 | www精品美女久久久tv | 色屁屁在线观看 | 亚洲日本欧美日韩高观看 | 男女啪啪高潮无遮挡免费动态 | 亚州av| 国产精品明星裸体写真集 | 国产午夜亚洲精品不卡 | 亚洲精品日韩一区二区电影 | a在线视频| 国产乱码精品一区二区三区五月婷 | 亚洲视频一区 | 国产精品美女一区二区 | 91av在线免费播放 | 青青久久久 | 99精品国自产在线观看 | 黄色一级视频 | 国产精品欧美一区二区三区不卡 | 色综合一区二区 | 视频一区在线播放 | 一区二区三区四区免费在线观看 | 国产成人精品综合 |