消息队列基础与选型?

2025年 阅读约 15 分钟 面试指南 · 消息中间件

深入解析消息队列基础:MQ核心概念(Producer/Broker/Consumer/Topic/Queue)、Kafka vs RocketMQ vs RabbitMQ对比、使用场景(解耦/异步/削峰)、消息模型(点对点/发布订阅),附面试模拟问答。

一句话总结

消息队列(MQ)是分布式系统中的异步通信中间件,核心角色:Producer(生产者,发送消息)、Broker(消息服务器,存储转发)、Consumer(消费者,接收处理)。三大作用:解耦(服务间不直接调用)、异步(非关键路径异步处理)、削峰(缓冲突发流量)。三大主流 MQ:Kafka(高吞吐、日志/流处理)、RocketMQ(事务消息、金融级可靠性)、RabbitMQ(灵活路由、低延迟)。

初级理解

MQ 三大作用

# 1. 解耦 # 没有 MQ:订单服务直接调用短信服务、积分服务 # 订单服务 → 短信服务(短信服务挂了,订单也失败) # 订单服务 → 积分服务 # 有了 MQ:订单服务只发消息,不关心谁消费 # 订单服务 → MQ → 短信服务 # → 积分服务 # → 数据分析服务(新增消费者无需改订单服务) # 2. 异步 # 同步:用户注册 → 写DB(50ms) → 发短信(200ms) → 送积分(100ms) = 350ms # 异步:用户注册 → 写DB(50ms) → 发消息(1ms) = 51ms # 短信服务异步消费 → 发短信 # 积分服务异步消费 → 送积分 # 3. 削峰 # 秒杀场景:瞬时 10 万请求 # 没有 MQ:系统被打垮 # 有了 MQ:请求先入队列,系统按处理能力消费(如 1000/s)

中级深入

Kafka vs RocketMQ vs RabbitMQ

对比维度KafkaRocketMQRabbitMQ
吞吐量极高(百万级/秒)高(十万级/秒)中等(万级/秒)
延迟毫秒级毫秒级微秒级
可靠性高(副本机制)极高(同步刷盘)
事务消息支持(0.11+)支持(核心特性)不支持
顺序消息分区内有序支持(全局/分区)不支持
延时消息不支持支持(18 个级别)插件支持
适用场景日志/流处理/大数据业务消息/金融通用/低延迟

消息模型

# 点对点(Queue) # 一条消息只能被一个消费者消费 # 消费者消费后消息删除 # 适用:下单、扣库存(只能处理一次) # 发布订阅(Topic) # 一条消息可以被多个消费者消费 # 每个消费者有自己的消费进度 # 适用:广播通知、数据同步 # Kafka/RocketMQ 都是发布订阅模型 # 通过 Consumer Group 实现点对点效果 # 同一个 Consumer Group 内,一条消息只被一个消费者消费 # 不同 Consumer Group 之间,消息广播

高级拓展

MQ 选型决策

# 选型决策树 # 1. 业务场景是什么? # 日志收集 / 流处理 / 大数据 → Kafka # 金融 / 电商交易 / 事务消息 → RocketMQ # 通用业务 / 低延迟 → RabbitMQ # 2. 是否需要事务消息? # 是 → RocketMQ(唯一原生支持) # 否 → 继续判断 # 3. 是否需要超高吞吐? # 是 → Kafka # 否 → RocketMQ 或 RabbitMQ # 4. 团队技术栈? # Java 为主 → RocketMQ(阿里系,中文文档好) # 多语言 → Kafka 或 RabbitMQ # 国内互联网公司推荐 # 阿里系 → RocketMQ # 字节/美团 → Kafka # 中小公司 → RocketMQ(功能全、运维简单)

消息队列核心概念

# 通用概念 # Producer:生产者,发送消息 # Consumer:消费者,接收消息 # Broker:消息服务器,存储和转发消息 # Topic:主题,消息分类 # Partition/Queue:分区/队列,并行处理单元 # Consumer Group:消费者组,组内竞争消费 # Offset:消费位移,记录消费进度 # 消息传递语义 # At Most Once:最多一次(可能丢消息) # At Least Once:至少一次(可能重复,默认) # Exactly Once:精确一次(最理想,实现复杂)

实战场景

场景:Spring Boot 整合 RocketMQ

# 1. 引入依赖 <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-spring-boot-starter</artifactId> </dependency> # 2. 配置 rocketmq: name-server: localhost:9876 producer: group: order-producer-group # 3. 发送消息 @Autowired private RocketMQTemplate rocketMQTemplate; public void sendOrderMessage(Order order) { rocketMQTemplate.convertAndSend("order-topic", order); } # 4. 消费消息 @RocketMQMessageListener(topic = "order-topic", consumerGroup = "order-consumer-group") @Component public class OrderConsumer implements RocketMQListener<Order> { @Override public void onMessage(Order order) { // 处理订单消息 } }

面试模拟

面试官:Kafka、RocketMQ、RabbitMQ 怎么选?

你:Kafka 适合日志/流处理/大数据(超高吞吐),RocketMQ 适合金融/电商交易(事务消息、高可靠),RabbitMQ 适合通用场景(低延迟、灵活路由)。国内互联网推荐 RocketMQ,功能全、中文文档好。

面试官:消息队列有什么作用?

你:三大作用:解耦(服务间不直接调用)、异步(非关键路径异步处理,提升响应速度)、削峰(缓冲突发流量,保护系统)。