MST

星途 面试题库

面试题:消息队列RocketMQ中延迟消息实现的基本原理是什么

请阐述RocketMQ实现延迟消息的大致流程,比如涉及到哪些关键组件以及它们如何协作来达成延迟投递消息的功能。
15.5万 热度难度
后端开发消息队列

知识考点

AI 面试

面试题答案

一键面试
  1. 关键组件
    • Producer:消息生产者,用于发送延迟消息。在发送消息时,会设置消息的延迟级别(delayLevel)。
    • Broker:消息中间件服务器,接收并存储消息。Broker 中有定时任务线程池(Timer)来处理延迟消息。Broker 维护了一个延迟队列(基于 CommitLog 和 ConsumeQueue 等存储结构),不同延迟级别的消息会被暂存到不同的延迟队列中。
    • Consumer:消息消费者,从 Broker 拉取消息进行消费。但延迟消息在延迟时间未到之前,不会被消费者拉取到。
  2. 协作流程
    • 消息发送:Producer 发送消息时指定延迟级别。例如,如果设置延迟级别为3,代表延迟某个特定的时间(延迟时间与延迟级别对应关系在 Broker 配置中定义)。
    • Broker 接收与存储:Broker 接收到消息后,根据延迟级别将消息存储到对应的延迟队列(如 ConsumeQueue 会按照延迟级别进行特殊处理)。消息并不会直接进入可供消费者消费的队列。
    • 定时任务处理:Broker 中的定时任务线程池会按照一定的时间间隔去检查延迟队列。当某个延迟队列中的消息延迟时间到达时,定时任务会将该消息从延迟队列转移到正常的可供消费的队列(如 ConsumeQueue 转换为正常的可供消费的结构)。
    • 消息消费:Consumer 从正常的可供消费的队列中拉取消息进行消费,此时延迟消息已经过了延迟时间,能够被正常处理。