学习消息队列时,不要一开始就陷进某个产品的参数里。先在脑子里搭一个最小模型:Producer 发送消息,Broker 存储和投递消息,Consumer 消费并确认消息。
这个模型想清楚后,再看 Kafka、RabbitMQ、RocketMQ 或其他 MQ,会容易很多。
基础数据流
最基础的 MQ 数据流是:
Producer -> Broker -> Consumer -> Ack -> Broker 删除或标记消息
这里有几个核心问题:
- Producer 如何发送成功。
- Broker 如何保存消息。
- Consumer 如何拉取或接收消息。
- Consumer 成功后如何确认。
- 失败时消息如何重试。
消息队列的很多高级特性,本质上都围绕这条链路展开。
Broker 为什么需要存储
如果 Broker 只负责转发,一旦消费者慢了或挂了,消息就会堆在内存里,风险很高。
所以 Broker 通常需要存储能力,用来处理:
- 消费者临时不可用。
- 消息堆积。
- 重试。
- 消息回溯。
- 高可用复制。
存储设计要权衡性能、可靠性和实现复杂度。越追求可靠,写入路径通常越重;越追求性能,就越要小心丢消息和一致性。
消费关系怎么维护
广播、集群消费、消费组这些能力都需要维护消费关系。系统要知道:
- 哪些消费者订阅了哪个 topic。
- 哪些消费者属于同一个消费组。
- 一个分区或队列当前由谁消费。
- 消费进度保存在哪里。
这些元数据可以放在配置中心、注册中心或 Broker 自己的元数据存储里。没有消费关系管理,MQ 很难支持复杂的订阅模型。
高可用要拆开看
MQ 的高可用至少包含三层:
- Producer 发送失败重试。
- Broker 节点故障切换。
- Consumer 消费失败重试。
Producer 侧要处理超时和重试;Broker 侧要处理副本、主从或分区 leader;Consumer 侧要处理重复消费、幂等和异常确认。
不要只说“MQ 高可用”,要说清楚是哪一段高可用。
可靠投递的几个问题
可靠投递通常要回答:
- 生产者怎么知道消息已到达 Broker。
- Broker 写入磁盘前宕机会怎样。
- 消费者处理成功但 ack 失败会怎样。
- 消息重复投递时业务是否幂等。
- 超过重试次数后消息去哪里。
如果业务不能接受重复消费,就要在业务层做幂等。大多数 MQ 更容易保证“至少一次”,而不是天然保证“刚好一次”。
事务消息和延迟消息
高级特性可以后看,但要知道它们解决什么问题:
- 事务消息:解决本地事务和消息发送的一致性问题。
- 延迟消息:解决未来某个时间再投递的问题。
- 死信队列:承接多次失败仍无法消费的消息。
- 顺序消息:让同一业务键上的消息按顺序消费。
每个特性都有成本,不要为了“高级”而默认使用。
学习 MQ 的顺序
一个比较稳的学习顺序是:
- 画出 Producer、Broker、Consumer 的数据流。
- 理解 topic、queue、partition、consumer group。
- 搭一个最小可运行示例。
- 看发送确认、消费确认和重试。
- 再看存储、高可用、顺序、事务和死信。
- 最后读源码或实现细节。
先有模型,再看产品,技术点才不会散。
正文完




