閱讀502 返回首頁    go 人物


定時消息和延時消息__特色功能_消息隊列 MQ-阿裏雲

本文檔主要介紹 MQ 定時消息和延時消息的概念、適用場景以及使用過程中的注意事項。

概念介紹

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

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

適用場景

定時/延時消息適用於如下一些場景:

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

使用方式

定時消息、延時消息的使用在代碼編寫上存在略微的區別:

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

發送定時消息

  1. public class ProducerDelayTest {
  2. public static void main(String[] args) {
  3. Properties properties = new Properties();
  4. properties.put(PropertyKeyConst.ProducerId, "XXX");//您在 MQ 控製台創建的 Producer ID
  5. properties.put(PropertyKeyConst.AccessKey, "XXX");// 阿裏雲身份驗證,在阿裏雲服務器管理控製台創建
  6. properties.put(PropertyKeyConst.SecretKey, "XXX");// 阿裏雲身份驗證,在阿裏雲服務器管理控製台創建
  7. Producer producer = ONSFactory.createProducer(properties);
  8. // 在發送消息前,必須調用 start 方法來啟動 Producer,隻需調用一次即可。
  9. producer.start();
  10. Message msg = new Message( //
  11. // Message Topic
  12. "Topic",
  13. // Message Tag 可理解為 Gmail 中的標簽,對消息進行再歸類,方便 Consumer 指定過濾條件在 MQ 服務器過濾
  14. "tag",
  15. // Message Body 可以是任何二進製形式的數據, MQ 不做任何幹預,需要 Producer 與 Consumer 協商好一致的序列化和反序列化方式
  16. "Hello MQ".getBytes());
  17. // 設置代表消息的業務關鍵屬性,請盡可能全局唯一
  18. // 以方便您在無法正常收到消息情況下,可通過 MQ 控製台查詢消息並補發。
  19. // 注意:不設置也不會影響消息正常收發
  20. msg.setKey("ORDERID_100");
  21. /**
  22. * 定時消息投遞,設置投遞的具體時間戳,單位毫秒例如2016-03-07 16:21:00投遞
  23. */
  24. long timeStamp =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2016-03-07 16:21:00").getTime();
  25. msg.setStartDeliverTime(timeStamp);
  26. // 發送消息,隻要不拋異常就是成功
  27. SendResult sendResult = producer.send(msg);
  28. System.out.println("Message Id:" + sendResult.getMessageId());
  29. // 在應用退出前,銷毀 Producer 對象
  30. // 注意:如果不銷毀也沒有問題
  31. producer.shutdown();
  32. }
  33. }

發送延時消息

  1. public class ProducerDelayTest {
  2. public static void main(String[] args) {
  3. Properties properties = new Properties();
  4. properties.put(PropertyKeyConst.ProducerId, "XXX");// 您在控製台創建的 Producer ID
  5. properties.put(PropertyKeyConst.AccessKey, "XXX");// AccessKey 阿裏雲身份驗證,在阿裏雲服務器管理控製台創建
  6. properties.put(PropertyKeyConst.SecretKey, "XXX");// SecretKey 阿裏雲身份驗證,在阿裏雲服務器管理控製台創建
  7. Producer producer = ONSFactory.createProducer(properties);
  8. // 在發送消息前,必須調用 start 方法來啟動 Producer,隻需調用一次即可。
  9. producer.start();
  10. Message msg = new Message( //
  11. // Message Topic
  12. "Topic",
  13. // Message Tag, 可理解為 Gmail 中的標簽,對消息進行再歸類,方便 Consumer 指定過濾條件在 MQ 服務器過濾
  14. "tag",
  15. // Message Body 可以是任何二進製形式的數據, MQ 不做任何幹預,需要 Producer 與 Consumer 協商好一致的序列化和反序列化方式
  16. "Hello MQ".getBytes());
  17. // 設置代表消息的業務關鍵屬性,請盡可能全局唯一。
  18. // 以方便您在無法正常收到消息情況下,可通過 MQ 控製台查詢消息並補發。
  19. // 注意:不設置也不會影響消息正常收發
  20. msg.setKey("ORDERID_100");
  21. // deliver time 單位 ms,指定一個時刻,在這個時刻之後才能被消費,這個例子表示 3s 後才能被消費
  22. long delayTime = 3000;
  23. msg.setStartDeliverTime(System.currentTimeMillis() + delayTime);
  24. // 發送消息,隻要不拋異常就是成功
  25. SendResult sendResult = producer.send(msg);
  26. System.out.println("Message Id:" + sendResult.getMessageId());
  27. // 在應用退出前,銷毀 Producer 對象
  28. // 注意:如果不銷毀也沒有問題
  29. producer.shutdown();
  30. }
  31. }

注意事項

  1. 定時/延時消息 msg.setStartDeliverTime 的參數需要設置成當前時間戳之後的某個時刻(單位毫秒),如果被設置成當前時間戳之前的某個時刻,消息將立刻投遞給消費者。
  2. 定時/延時消息 msg.setStartDeliverTime 的參數可設置40天內的任何時刻(單位毫秒),超過40天消息發送將失敗。
  3. 消費者存在消息堆積時,定時/延時消息將不能嚴格按照配置的時間進行消費。

最後更新:2016-11-23 16:04:16

  上一篇:go 集群消費和廣播消費__特色功能_消息隊列 MQ-阿裏雲
  下一篇:go 發布訂閱管理__控製台使用指南_消息隊列 MQ-阿裏雲