Kafka | Kafka中如何實現死信隊列&重試隊列

 

當一條消息初次消費失敗,消息隊列 MQ 會自動進行消息重試;達到最大重試次數後,若消費依然失敗,則表明消費者在正常情況下無法正確地消費該消息,此時,消息隊列 MQ 不會立刻將消息丟棄,而是將其發送到該消費者對應的特殊隊列中,這種正常情況下無法被消費的消息稱爲死信消息(Dead-Letter Message),存儲死信消息的特殊隊列稱爲死信隊列(Dead-Letter Queue)

與此對應的還有一個“回退隊列”的概念,試想如果消費者在消費時發生了異常,那麼就不會對這一次消費進行確認(Ack),進而發生回滾消息的操作之後消息始終會放在隊列的頂部,然後不斷被處理和回滾,導致隊列陷入死循環。爲了解決這個問題,可以爲每個隊列設置一個回退隊列,它和死信隊列都是爲異常的處理提供的一種機制保障。實際情況下,回退隊列的角色可以由死信隊列和重試隊列來扮演。

重試隊列其實可以看成是一種回退隊列,具體指消費端消費消息失敗時,爲防止消息無故丟失而重新將消息回滾到Broker中。與回退隊列不同的是重試隊列一般分成多個重試等級,每個重試等級一般也會設置重新投遞延時,重試次數越多投遞延時就越大。

舉個例子:消息第一次消費失敗入重試隊列Q1,Q1的重新投遞延遲爲5s,在5s過後重新投遞該消息;如果消息再次消費失敗則入重試隊列Q2,Q2的重新投遞延遲爲10s,在10s過後再次投遞該消息。以此類推,重試越多次重新投遞的時間就越久,爲此需要設置一個上限,超過投遞次數就入死信隊列。重試隊列與延遲隊列有相同的地方,都是需要設置延遲級別,它們彼此的區別是:延遲隊列動作由內部觸發,重試隊列動作由外部消費端觸發;延遲隊列作用一次,而重試隊列的作用範圍會向後傳遞。

 

Kafka不支持重試機制也就不支持消息重試,也不支持死信隊列,因此使用kafka做消息隊列時,如果遇到了消息在業務處理時出現異常的場景時,需要額外實現消息重試的功能

 

跟着大佬繼續學習:

https://www.jianshu.com/p/8f7ebbcbeee5

https://blog.csdn.net/sz85850597/article/details/86749783

https://help.aliyun.com/document_detail/43490.html

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章