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