延迟消息发送

延时消息介绍

延迟消息发送是指消息发送到Apache RocketMQ后,并不期望立马投递这条消息,而是延迟一定时间后才投递到Consumer进行消费。

在分布式定时调度触发、任务超时处理等场景,需要实现精准、可靠的延时事件触发。使用 RocketMQ 的延时消息可以简化定时调度任务的开发逻辑,实现高性能、可扩展、高可靠的定时触发能力。

定时消息场景一

延时消息约束

Apache RocketMQ 一共支持18个等级的延迟投递,具体时间如下:

投递等级(delay level)延迟时间投递等级(delay level)延迟时间
11s106min
25s117min
310s128min
430s139min
51min1410min
62min1520min
73min1630min
84min171h
95min182h

延时消息示例代码

延迟消息的示例代码如下:

  1. public class ScheduledMessageProducer {
  2. public static void main(String[] args) throws Exception {
  3. // Instantiate a producer to send scheduled messages
  4. DefaultMQProducer producer = new DefaultMQProducer("ExampleProducerGroup");
  5. // Launch producer
  6. producer.start();
  7. int totalMessagesToSend = 100;
  8. for (int i = 0; i < totalMessagesToSend; i++) {
  9. Message message = new Message("TestTopic", ("Hello scheduled message " + i).getBytes());
  10. // This message will be delivered to consumer 10 seconds later.
  11. message.setDelayTimeLevel(3);
  12. // Send the message
  13. producer.send(message);
  14. }
  15. // Shutdown producer after use.
  16. producer.shutdown();
  17. }
  18. }

延迟消息发送 - 图2提示

这里最重要的是message中设置延迟等级,例子中设置的等级是3,也就是发送者发送后,10s后消费者才能收到消息。

延迟消息发送 - 图3提示

延时消息的实现逻辑需要先经过定时存储等待触发,延时时间到达后才会被投递给消费者。因此,如果将大量延时消息的定时时间设置为同一时刻,则到达该时刻后会有大量消息同时需要被处理,会造成系统压力过大,导致消息分发延迟,影响定时精度。