技術方案
方案背景
Kafka隊列消息消費處理過程中,發生處理異常,需要實現重試機制,并基于重試次數實現不同延遲時間重試方案。
方案介紹
通過實現Kafka延遲隊列來實現消息重試機制。
目標:
- 支持所有業務場景的延遲重試
- 支持多級別延遲重試
- 保證消息 最少消費一次
核心內容:
-
延遲隊列,Kafka本身不支持延遲隊列機制,這里我們通過定義多種Topic來擴展實現。例如Topic-1、Topic-2、Topic-3 分別代表延遲1分鐘、2分鐘、3分鐘的隊列。
a. 每種延遲級別獨立一個Topic
b. 分區數建議與延遲調度服務部署量一致,以便于調度服務簡化處理。建議值 2 -
延遲隊列消費調度服務,負責從延遲隊列拉取消息。
a. 判斷消息是否達到延遲時間,
i. 若未達到,則delay 延遲時間-當前時間;
ii. 若已達到,則將消息轉發至對應的業務消息隊列。
b. 集群部署數量 建議值 2,消費部署數與分區數一致,以保證數據消費順序及處理及時性
c. 若重試次數已達到最大值,則丟失數據,并發送異常警報(釘釘)
d. 考慮延遲隊列修改offset,重新處理消息機制 -
業務消費服務改造,
a. 數據處理異常時,組裝延遲重試消息,將異常數據推送至延遲隊列消息。
b. 鑒于當前業務消費 BulkCopy 批量處理邏輯
技術架構
架構圖
Topic-1、Topic-2、Topic-3 分別代表延遲1分鐘、2分鐘、3分鐘的隊列