亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

概述

Kafka的強(qiáng)大功能之一是每個(gè)分區(qū)都有一個(gè)Consumer的偏移值。該偏移值是消費(fèi)者將讀取的下一條消息的值??梢宰詣?dòng)或手動(dòng)增加該值。如果我們由于錯(cuò)誤而無(wú)法處理消息并想重試,我們可以選擇手動(dòng)管理,并在成功的情況下增加偏移量。但是,這會(huì)暫時(shí)阻止隊(duì)列消息的處理。我們可以選擇異步方法。

為什么我們需要它?

如果發(fā)生錯(cuò)誤,而不是停止隊(duì)列消息的處理;我們可以將錯(cuò)誤消息轉(zhuǎn)移到不同的主題并再次處理。

如果在處理 Kafka 消息時(shí)出現(xiàn)錯(cuò)誤,可以使用 RetryableTopic 注解以一定的時(shí)間間隔和一定的次數(shù)再次處理消息。如果完成嘗試次數(shù)后錯(cuò)誤仍然存在,則消息將發(fā)送到 DLT 隊(duì)列。

如何使用?

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

attempts:嘗試處理消息的次數(shù)。它的默認(rèn)值為 3。如果完成所有嘗試后仍然收到錯(cuò)誤,則消息將發(fā)送到 DLT 隊(duì)列。

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

排除/排除名稱:允許您排除指定的異常類。當(dāng)您添加到列表中的任何錯(cuò)誤被拋出時(shí),重試機(jī)制將不會(huì)被激活。

include / includeNames:僅當(dāng)拋出指定的異常時(shí)才會(huì)激活重試機(jī)制。

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

autoCreateTopics:決定是否自動(dòng)創(chuàng)建Retry和DLT主題。

retryTopicSuffix / dltTopicSuffix:用于確定要添加到自動(dòng)創(chuàng)建的主題末尾的后綴。

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

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

Backoff的示例:

  • 具有固定的增量值
Backoff(delay = 600000 ) // 每 10 分鐘
  • 具有指數(shù)價(jià)值
 
Backoff(delay = 60000 , multiplier = 2 ) // 1、2、4、8... 分鐘后重復(fù)。
  • 用占位符定義值
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小時(shí)。如果任何嘗試均順利完成,則試用將終止。

由于定義了 SINGLE_TOPIC,因此將創(chuàng)建單個(gè)主題以進(jìn)行重試。如果沒(méi)有進(jìn)行此定義,則會(huì)創(chuàng)建 12 個(gè)重試主題。

如果拋出了排除中定義的任何錯(cuò)誤,則不會(huì)執(zhí)行重做。

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

DLT隊(duì)列處理

如果完成了定義的嘗試次數(shù)并且繼續(xù)收到錯(cuò)誤,則消息將發(fā)送到 DLT 隊(duì)列。如果要處理這些消息,可以使用DltHandler注解。

用法示例:

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

注意事項(xiàng)

雖然使用 RetryableTopic 的異步處理優(yōu)勢(shì)為我們帶來(lái)了性能提升,但這種使用也有一些缺點(diǎn)。

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

讓我們用一個(gè)例子來(lái)解釋這種情況:當(dāng)主主題在時(shí)間 t 處理時(shí),一條消息出錯(cuò)并被發(fā)送到重試主題。在時(shí)間 t + 1 時(shí),另一條消息來(lái)到主主題并成功處理。讓我們?cè)谥卦囍黝}中的消息在時(shí)間 t + 2 時(shí)被成功處理。在這種情況下,第一條傳入消息將在第二條消息之后處理。如果訂購(gòu)對(duì)您很重要,我建議您在消息處理過(guò)程中進(jìn)行必要的檢查。

另一個(gè)缺點(diǎn)是消息雙重處理的風(fēng)險(xiǎn)。您可以通過(guò)考慮這種可能性來(lái)進(jìn)行改進(jìn)。

分享到:
標(biāo)簽:Spring
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定