一、RocketMQ 定期延迟消息原理
RocketMQ 的延迟消息是通过延迟级别(delay level)来实现的。在发送延迟消息时,用户可以指定一个延迟级别,RocketMQ 会根据这个级别将消息存储在特定的队列中,并在延迟时间到达后将消息投递到目标队列中进行消费。
RocketMQ 目前支持 18 个延迟级别,分别对应不同的延迟时间,从 1s、5s、10s、30s、1m、2m、3m、4m、5m、6m、7m、8m、9m、10m、20m、30m、1h、2h。用户可以根据自己的需求选择合适的延迟级别。
当消息被发送到 RocketMQ 时,如果是延迟消息,会先进入一个特殊的主题(SCHEDULE_TOPIC_XXXX),这个主题下有多个队列,每个队列对应一个延迟级别。消息在这些队列中等待,直到延迟时间到达,然后被重新投递到目标主题中进行消费。

总共有6个步骤,分别如下:
1.修改消息Topic名称和队列信息
2.转发消息到延迟主题的CosumeQueue中
3.延迟服务消费SCHEDULE_TOPIC_XXXX消息
4.将信息重新存储到CommitLog中
5.将消息投递到目标Topic中
6.消费者消费目标topic中的数据
二、应用场景举例
订单超时未支付自动关闭:在电商系统中,用户下单后如果在一定时间内未支付,订单需要自动关闭。可以使用 RocketMQ 的延迟消息,在下单时发送一个延迟消息,延迟时间设置为订单超时时间,当延迟时间到达时,消费消息进行订单关闭操作。
短信验证码超时:在用户注册或登录时,发送短信验证码后,如果用户在一定时间内未输入验证码,验证码需要失效。可以使用延迟消息,在发送验证码时同时发送一个延迟消息,延迟时间设置为验证码的有效时间,当延迟时间到达时,消费消息使验证码失效。
任务超时提醒:在一些任务处理系统中,如果任务处理时间超过一定时间,需要进行提醒。可以发送一个延迟消息,延迟时间设置为任务超时时间,当延迟时间到达时,消费消息进行提醒操作。
三、常见面试题
RocketMQ 的延迟消息是如何实现的?
答:RocketMQ 的延迟消息是通过延迟级别来实现的。消息被发送到一个特殊的主题中,根据延迟级别存储在不同的队列中,等待延迟时间到达后被重新投递到目标主题中进行消费。
RocketMQ 支持多少个延迟级别?分别对应哪些延迟时间?
答:RocketMQ 目前支持 18 个延迟级别,分别对应 1s、5s、10s、30s、1m、2m、3m、4m、5m、6m、7m、8m、9m、10m、20m、30m、1h、2h 的延迟时间。
请举例说明 RocketMQ 延迟消息的应用场景?
答:订单超时未支付自动关闭、短信验证码超时、任务超时提醒等场景都可以使用 RocketMQ 的延迟消息来实现。
如果需要实现一个自定义的延迟时间,如何在 RocketMQ 中实现?
答:RocketMQ 提供的延迟级别是固定的,如果需要实现自定义的延迟时间,可以通过多次发送延迟消息的方式来实现。例如,如果需要实现一个 35s 的延迟时间,可以先发送一个 30s 的延迟消息,然后在消费这个消息时再发送一个 5s 的延迟消息。
总之,RocketMQ 的定期延迟消息功能为分布式系统中的很多业务场景提供了便利。了解其原理和应用场景,以及常见面试题,对于深入掌握 RocketMQ 以及在面试中取得好成绩都非常有帮助。




