一、消息队列的本质模型
所有 MQ 本质上都是同一个模型:
生产者(Producer) → 消息队列(Queue/Topic) → 消费者(Consumer)
再抽象一层:
发消息的人 → 存消息的地方 → 收消息的人
二、通用核心概念(所有 MQ 都有)
1. 生产者 Producer
- 负责发送消息到 MQ
- 不关心谁消费、什么时候消费
- 只关心:发没发成功、会不会丢消息
2. 消费者 Consumer
- 从 MQ 拉取 / 接收消息并处理
- 关心:能不能收到、会不会重复、处理失败怎么办
3. 消息 Message
- 载体:业务数据(JSON、字符串、字节)
- 自带属性:消息 ID、时间戳、过期时间、重试次数等
4. 队列 / 主题 Queue / Topic
- Queue:一对一,一条消息只被一个消费者处理
- Topic:一对多,一条消息可以被多个消费组同时消费
5. 消费组 Consumer Group
一组消费者共同消费同一个 Topic/Queue
- 同一组内:负载均衡(分摊消息)
- 不同组间:广播(都收到全量消息)
这是 MQ 最重要的概念之一,几乎所有 MQ 都用这个模型。
6. 偏移量 Offset
消息在队列里的位置编号
- 用来标记:消费者消费到哪了
- 消费失败 / 重启后,从该位置继续消费
7. ACK 确认机制
消费者告诉 MQ:“这条消息我处理完了”
- 自动 ACK:快,但可能丢消息
- 手动 ACK:安全,保证不丢,但要自己控制
8. 持久化 Durable
MQ 重启后消息不丢失
- 队列 / 主题持久化
- 消息本身持久化
- 消费位点持久化
9. 死信队列 Dead Letter Queue
处理失败、过期、被拒绝的消息,会进入死信
用于后续人工排查,不阻塞正常业务
10. 消息堆积
消费者处理太慢 → 队列里消息越来越多
表现:延迟变高、消费停滞
三、三大 MQ 的消息模型区别(核心重点)
1. RabbitMQ 模型:Exchange + Queue
完整链路:
Producer → Exchange → Queue → Consumer
- Exchange 交换机:负责路由消息
- Direct:精确匹配
- Topic:通配符匹配
- Fanout:广播(全部发)
- Headers:按消息头匹配
- Queue:真正存消息的地方
- 一个消息可以被路由到多个队列
- 典型:灵活路由、微服务解耦、异步通知
2. Kafka 模型:Topic + Partition
完整链路:
Producer → Topic → Partition → Consumer Group
- Topic:逻辑分类(如 order_topic、pay_topic)
- Partition 分区:物理分片,实现高吞吐
- 一个 Topic 包含多个 Partition
- 消息被均匀分发到不同分区
- 顺序保证:同一个分区内严格有序
- 典型:日志收集、大数据流、高吞吐场景
3. RocketMQ 模型:Topic + MessageQueue
和 Kafka 非常像,但更面向金融 / 电商高可靠
- Topic:业务主题
- MessageQueue:类似 Kafka 分区
- 支持:事务消息、定时消息、死信、重试队列
- 典型:电商订单、支付、高可靠金融消息
四、三种消息投递模式(所有 MQ 通用)
1. 集群消费(默认)
一个消息只被一个消费者处理
负载均衡,提高处理速度
2. 广播消费
一个消息被所有消费者都处理一遍
用于配置刷新、本地缓存更新等
3. 延迟 / 定时消息
消息发送后,等待一段时间才可见
RocketMQ 原生支持,Kafka/RabbitMQ 需要插件
五、一句话总结模型
- RabbitMQ:灵活路由,Exchange 分发到 Queue
- Kafka:高吞吐,分区并行,日志型流式处理
- RocketMQ:高可靠,电商金融级,事务 / 定时消息强