一句话总结
消息队列(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
| 对比维度 | Kafka | RocketMQ | RabbitMQ |
|---|---|---|---|
| 吞吐量 | 极高(百万级/秒) | 高(十万级/秒) | 中等(万级/秒) |
| 延迟 | 毫秒级 | 毫秒级 | 微秒级 |
| 可靠性 | 高(副本机制) | 极高(同步刷盘) | 高 |
| 事务消息 | 支持(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,功能全、中文文档好。
面试官:消息队列有什么作用?
你:三大作用:解耦(服务间不直接调用)、异步(非关键路径异步处理,提升响应速度)、削峰(缓冲突发流量,保护系统)。