基础概念与架构
一、什么是消息队列
消息队列(Message Queue,简称 MQ)是一种异步通信中间件,用于在分布式系统中传递消息。
- 本质:一个"先进先出"的队列,生产者往队列里放消息,消费者从队列里取消息。
- 核心价值:解耦、异步、削峰。
类比:MQ 就像快递站。你寄包裹不用等收件人,给快递站就行;快递站暂存包裹,快递员按需派送。
二、为什么使用消息队列
| 场景 | 说明 |
|---|---|
| 解耦 | 生产者不需要知道消费者是谁,只需把消息发给 MQ。新增消费者不影响生产者。 |
| 异步 | 生产者发送消息后立即返回,不必等待消费者处理,提升响应速度。 |
| 削峰 | 高并发请求先写入 MQ,消费者按自身能力慢慢处理,避免系统被瞬时流量打垮。 |
代价:
- 系统复杂度增加
- 消息可能丢失或重复
- 需要保证最终一致性
三、核心概念
| 概念 | 说明 |
|---|---|
| Producer(生产者) | 发送消息的一方。 |
| Consumer(消费者) | 接收并处理消息的一方。 |
| Broker(消息服务器) | 存储和转发消息的核心组件。 |
| Topic(主题) | 消息的逻辑分类,生产者发送到指定 Topic,消费者订阅 Topic。 |
| MessageQueue(消息队列) | Topic 的物理分区,一个 Topic 可包含多个 Queue,用于并行生产和消费。 |
| Message(消息) | 传递的数据单元,包含 Topic、Body、Tag、Key 等属性。 |
| Offset(偏移量) | 消费者在 Queue 中消费位置的标记。 |
| ConsumerGroup(消费者组) | 一组消费者的集合,组内消费者共同消费一个 Topic,每条消息只被组内一个消费者消费。 |
| ProducerGroup(生产者组) | 一组生产者的集合,通常用于事务消息回查。 |
四、核心架构(以 RocketMQ 为例)
┌─────────────┐ ┌─────────────┐
│ Producer │ │ Consumer │
└──────┬──────┘ └──────┬──────┘
│ │
│ 发送/订阅 │
▼ ▼
┌─────────────────────────────────┐
│ NameServer │ ← 路由注册与发现
│ (无状态,节点间不同步) │
└─────────────────────────────────┘
▲ ▲
│ 注册/心跳 │
│ │
┌──────┴──────┐ ┌──────┴──────┐
│ Broker │ │ Broker │ ← 消息存储与转发
│ (Master) │◄───►│ (Slave) │
└─────────────┘ └─────────────┘
1. NameServer(路由中心)
- 无状态节点,多个 NameServer 之间不通信。
- Broker 启动时向所有 NameServer 注册,并定期发送心跳。
- Producer/Consumer 从 NameServer 获取 Topic 的路由信息(哪些 Broker、哪些 Queue)。
2. Broker(消息服务器)
- 负责消息的存储、转发、查询。
- 通常以主从(Master-Slave)或 Dledger 集群方式部署,保证高可用。
- 每个 Broker 管理多个 Topic,每个 Topic 有多个 MessageQueue。
3. Producer(生产者)
- 从 NameServer 获取路由信息。
- 根据负载均衡策略选择一个 MessageQueue 发送消息。
- 支持同步、异步、单向发送。
4. Consumer(消费者)
- 从 NameServer 获取路由信息。
- 从 Broker 拉取消息(推模式本质也是拉)。
- 支持集群消费(一条消息只被组内一个消费者消费)和广播消费(一条消息被所有消费者消费)。
五、消息模型
| 模型 | 说明 |
|---|---|
| 点对点(Point-to-Point) | 一条消息只被一个消费者消费。 |
| 发布订阅(Pub/Sub) | 一条消息被多个订阅者消费。 |
| 集群消费(Clustering) | 同一 ConsumerGroup 内,一条消息只被一个消费者消费。RocketMQ 默认模式。 |
| 广播消费(Broadcasting) | 同一 ConsumerGroup 内,一条消息被所有消费者各消费一次。 |
六、工作流程概览
- 启动:Broker 向 NameServer 注册;Producer/Consumer 从 NameServer 拉取路由。
- 发送:Producer 根据路由选择 MessageQueue,发送消息到 Broker。
- 存储:Broker 将消息顺序写入 CommitLog,并异步构建 ConsumeQueue 和 IndexFile。
- 消费:Consumer 从 Broker 拉取消息,处理完成后提交 Offset。
- 高可用:Master 同步消息到 Slave;NameServer 集群容忍单点故障。
七、常见消息类型(简要)
| 类型 | 说明 |
|---|---|
| 普通消息 | 无特殊语义,最常用。 |
| 顺序消息 | 保证同一队列内消息按发送顺序消费。 |
| 事务消息 | 保证"本地事务 + 消息发送"的最终一致性。 |
| 延时消息 | 指定延时时间后投递。 |
八、总结
- MQ 解决解耦、异步、削峰三大问题。
- 核心组件:Producer、Consumer、Broker、NameServer、Topic、Queue。
- RocketMQ 架构:NameServer 路由 + Broker 存储 + 主从/Dledger 高可用。
- 消费模式:集群消费和广播消费。
- 后续需深入:消息不丢、重复消费、顺序、积压、事务消息。