1. 程式人生 > 實用技巧 >延遲訊息功能

延遲訊息功能

訊息佇列 CMQ 延遲訊息功能 - 訊息佇列(Queue)模型 - 文件中心 - 騰訊雲 https://cloud.tencent.com/document/product/406/8128

最近更新時間:2020-04-20 10:50:01

CMQ 訊息定時器允許您為要新增到佇列的訊息指定初始的不可見時段,稱為飛行狀態。例如,如果您傳送一條訊息並將 DelaySeconds 引數設定為45,則使用者在該訊息進入佇列後的前45秒將看不到該訊息。DelaySeconds 的預設值為0。

延遲訊息設定範圍:指定 Queue 生產訊息時,可增加 DelaySeconds 入參,取值範圍為0 - 3600秒,即訊息最長不可見時長為1小時。若為空,則無延遲效果。

使用限制:每個佇列處於飛行狀態的訊息數限制為2萬條,若佇列中處於飛行狀態的訊息超過2萬條,則新生產的訊息不允許消費,需要等待當前飛行狀態的訊息到期才可以繼續消費。Topic 模式下該能力暫不支援。

定時和延時訊息_訊息型別_功能與特性_產品簡介_訊息佇列 RocketMQ 版-阿里雲 https://help.aliyun.com/document_detail/43349.html

本文主要介紹訊息佇列 RocketMQ 版的定時訊息和延時訊息的概念、適用場景以及使用過程中的注意事項。

概念介紹

  • 定時訊息:Producer 將訊息傳送到訊息佇列 RocketMQ 版服務端,但並不期望立馬投遞這條訊息,而是推遲到在當前時間點之後的某一個時間投遞到 Consumer 進行消費,該訊息即定時訊息。
  • 延時訊息:Producer 將訊息傳送到訊息佇列 RocketMQ 版服務端,但並不期望立馬投遞這條訊息,而是延遲一定時間後才投遞到 Consumer 進行消費,該訊息即延時訊息。

定時訊息與延時訊息在程式碼配置上存在一些差異,但是最終達到的效果相同:訊息在傳送到訊息佇列 RocketMQ 版服務端後並不會立馬投遞,而是根據訊息中的屬性延遲固定時間後才投遞給消費者。

適用場景

定時訊息和延時訊息適用於以下一些場景:

  • 訊息生產和消費有時間視窗要求,例如在電商交易中超時未支付關閉訂單的場景,在訂單建立時會發送一條延時訊息。這條訊息將會在 30 分鐘以後投遞給消費者,消費者收到此訊息後需要判斷對應的訂單是否已完成支付。如支付未完成,則關閉訂單。如已完成支付則忽略。
  • 通過訊息觸發一些定時任務,例如在某一固定時間點向用戶傳送提醒訊息。

使用方式

定時訊息和延時訊息的使用在程式碼編寫上存在略微的區別:

  • 傳送定時訊息需要明確指定訊息傳送時間點之後的某一時間點作為訊息投遞的時間點。
  • 傳送延時訊息時需要設定一個延時時間長度,訊息將從當前傳送時間點開始延遲固定時間之後才開始投遞。

注意事項

  • 定時訊息的精度會有 1s ~ 2s 的延遲誤差。
  • 定時和延時訊息的msg.setStartDeliverTime引數需要設定成當前時間戳之後的某個時刻(單位毫秒)。如果被設定成當前時間戳之前的某個時刻,訊息將立刻投遞給消費者。
  • 定時和延時訊息的msg.setStartDeliverTime引數可設定 40 天內的任何時刻(單位毫秒),超過 40 天訊息傳送將失敗。
  • StartDeliverTime是服務端開始向消費端投遞的時間。 如果消費者當前有訊息堆積,那麼定時和延時訊息會排在堆積訊息後面,將不能嚴格按照配置的時間進行投遞。
  • 由於客戶端和服務端可能存在時間差,訊息的實際投遞時間與客戶端設定的投遞時間之間可能存在偏差。
  • 設定定時和延時訊息的投遞時間後,依然受 3 天的訊息儲存時長限制。

    例如,設定定時訊息 5 天后才能被消費,如果第 5 天后一直沒被消費,那麼這條訊息將在第 8 天被刪除。