消息队列怎么从零设计:Producer、Broker、Consumer 与可靠投递

1次阅读
没有评论

学习消息队列时,不要一开始就陷进某个产品的参数里。先在脑子里搭一个最小模型:Producer 发送消息,Broker 存储和投递消息,Consumer 消费并确认消息。

这个模型想清楚后,再看 Kafka、RabbitMQ、RocketMQ 或其他 MQ,会容易很多。

基础数据流

最基础的 MQ 数据流是:

Producer -> Broker -> Consumer -> Ack -> Broker 删除或标记消息

这里有几个核心问题:

  • Producer 如何发送成功。
  • Broker 如何保存消息。
  • Consumer 如何拉取或接收消息。
  • Consumer 成功后如何确认。
  • 失败时消息如何重试。

消息队列的很多高级特性,本质上都围绕这条链路展开。

Broker 为什么需要存储

如果 Broker 只负责转发,一旦消费者慢了或挂了,消息就会堆在内存里,风险很高。

所以 Broker 通常需要存储能力,用来处理:

  • 消费者临时不可用。
  • 消息堆积。
  • 重试。
  • 消息回溯。
  • 高可用复制。

存储设计要权衡性能、可靠性和实现复杂度。越追求可靠,写入路径通常越重;越追求性能,就越要小心丢消息和一致性。

消费关系怎么维护

广播、集群消费、消费组这些能力都需要维护消费关系。系统要知道:

  • 哪些消费者订阅了哪个 topic。
  • 哪些消费者属于同一个消费组。
  • 一个分区或队列当前由谁消费。
  • 消费进度保存在哪里。

这些元数据可以放在配置中心、注册中心或 Broker 自己的元数据存储里。没有消费关系管理,MQ 很难支持复杂的订阅模型。

高可用要拆开看

MQ 的高可用至少包含三层:

  1. Producer 发送失败重试。
  2. Broker 节点故障切换。
  3. Consumer 消费失败重试。

Producer 侧要处理超时和重试;Broker 侧要处理副本、主从或分区 leader;Consumer 侧要处理重复消费、幂等和异常确认。

不要只说“MQ 高可用”,要说清楚是哪一段高可用。

可靠投递的几个问题

可靠投递通常要回答:

  • 生产者怎么知道消息已到达 Broker。
  • Broker 写入磁盘前宕机会怎样。
  • 消费者处理成功但 ack 失败会怎样。
  • 消息重复投递时业务是否幂等。
  • 超过重试次数后消息去哪里。

如果业务不能接受重复消费,就要在业务层做幂等。大多数 MQ 更容易保证“至少一次”,而不是天然保证“刚好一次”。

事务消息和延迟消息

高级特性可以后看,但要知道它们解决什么问题:

  • 事务消息:解决本地事务和消息发送的一致性问题。
  • 延迟消息:解决未来某个时间再投递的问题。
  • 死信队列:承接多次失败仍无法消费的消息。
  • 顺序消息:让同一业务键上的消息按顺序消费。

每个特性都有成本,不要为了“高级”而默认使用。

学习 MQ 的顺序

一个比较稳的学习顺序是:

  1. 画出 Producer、Broker、Consumer 的数据流。
  2. 理解 topic、queue、partition、consumer group。
  3. 搭一个最小可运行示例。
  4. 看发送确认、消费确认和重试。
  5. 再看存储、高可用、顺序、事务和死信。
  6. 最后读源码或实现细节。

先有模型,再看产品,技术点才不会散。

正文完
 0
bdspAdmin
版权声明:本站原创文章,由 bdspAdmin 于2026-07-05发表,共计1210字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)