RocketMQ定時/延時訊息

ZuiTaiPing發表於2024-04-25

什麼是延時訊息

當訊息寫入到Broker後,在指定的時長後才可被消費處理的訊息,稱為延時訊息。
採用RocketMQ的延時訊息可以實現定時任務的功能,而無需使用定時器。典型的應用場景是,電商交
易中超時未支付關閉訂單的場景,12306平臺訂票超時未支付取消訂票的場景。

在電商平臺中,訂單建立時會傳送一條延遲訊息。這條訊息將會在30分鐘後投遞給後臺業務系
統(Consumer),後臺業務系統收到該訊息後會判斷對應的訂單是否已經完成支付。如果未完
成,則取消訂單,將商品再次放回到庫存;如果完成支付,則忽略。
在12306平臺中,車票預訂成功後就會傳送一條延遲訊息。這條訊息將會在45分鐘後投遞給後臺
業務系統(Consumer),後臺業務系統收到該訊息後會判斷對應的訂單是否已經完成支付。如
果未完成,則取消預訂,將車票再次放回到票池;如果完成支付,則忽略。

延時訊息生命週期

image

  • 初始化:訊息被生產者構建並完成初始化,待傳送到服務端的狀態。

  • 定時中:訊息被髮送到服務端,和普通訊息不同的是,服務端不會直接構建訊息索引,而是會將定時訊息單獨儲存在定時儲存系統中,等待定時時刻到達。

  • 待消費:定時時刻到達後,服務端將訊息重新寫入普通儲存引擎,對下游消費者可見,等待消費者消費的狀態。

  • 消費中:訊息被消費者獲取,並按照消費者本地的業務邏輯進行處理的過程。 此時服務端會等待消費者完成消費並提交消費結果,如果一定時間後沒有收到消費者的響應,Apache RocketMQ會對訊息進行重試處理。

  • 消費提交:消費者完成消費處理,並向服務端提交消費結果,服務端標記當前訊息已經被處理(包括消費成功和失敗)。 Apache RocketMQ 預設支援保留所有訊息,此時訊息資料並不會立即被刪除,只是邏輯標記已消費。訊息在儲存時間到期或儲存空間不足被刪除前,消費者仍然可以回溯訊息重新消費。

  • 訊息刪除:Apache RocketMQ按照訊息儲存機制滾動清理最早的訊息資料,將訊息從物理檔案中刪除。

使用限制

訊息型別一致性

定時訊息僅支援在 MessageType為Delay 的主題內使用,即定時訊息只能傳送至型別為定時訊息的主題中,傳送的訊息的型別必須和主題的型別一致。

定時精度約束

Apache RocketMQ 定時訊息的定時時長引數精確到毫秒級,但是預設精度為1000ms,即定時訊息為秒級精度。

Apache RocketMQ 定時訊息的狀態支援持久化儲存,系統由於故障重啟後,仍支援按照原來設定的定時時間觸發訊息投遞。若儲存系統異常重啟,可能會導致定時訊息投遞出現一定延遲。

相關文章