mq

MQ 系列 定时消息

刨析rocketMQ的底层实现

Posted by lichao modified on September 29, 2019

定时消息

  • Kafka 不支持定时消息;
  • RocketMQ 支持两类定时消息;
    • 开源版本 RocketMQ 仅支持定时级别,定时级用户可定制;
    • 阿里云MQ指定的毫秒级别的延时时间

定时消息(延迟队列)是指消息发送到 broker 后,不会立即被消费,等待特定时间投递给真正的 topic。 broker 有配置项 messageDelayLevel ,默认值为 “1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h”,18 个 level。可以配置自定义 messageDelayLevel。注意,messageDelayLevel 是 broker 的属性,不属于某个 topic。发消息时,设置 delayLevel 等级即可:msg.setDelayLevel(level)。level 有以下三种情况:

  • level == 0,消息为非延迟消息
  • 1 <= level <= maxLevel, 消息延迟特定时间, 例如level == 1,延迟1s
  • level > maxLevel,则 level == maxLevel,例如level == 20,延迟2h

定时消息会暂存在名为SCHEDULE_TOPIC_XXXX的 topic 中,并根据delayTimeLevel存入特定的queue,queueId = delayTimeLevel – 1,即一个queue只存相同延迟的消息,保证具有相同发送延迟的消息能够顺序消费。broker 会调度地消费 SCHEDULE_TOPIC_XXXX,将消息写入真实的topic。

需要注意的是,定时消息会在第一次写入和调度写入真实 topic 时都会计数,因此发送数量、tps都会变高。