MQ 基础概念与架构

0 阅读4分钟

基础概念与架构

一、什么是消息队列

消息队列(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 内,一条消息被所有消费者各消费一次。

六、工作流程概览

  1. 启动:Broker 向 NameServer 注册;Producer/Consumer 从 NameServer 拉取路由。
  2. 发送:Producer 根据路由选择 MessageQueue,发送消息到 Broker。
  3. 存储:Broker 将消息顺序写入 CommitLog,并异步构建 ConsumeQueue 和 IndexFile。
  4. 消费:Consumer 从 Broker 拉取消息,处理完成后提交 Offset。
  5. 高可用:Master 同步消息到 Slave;NameServer 集群容忍单点故障。

七、常见消息类型(简要)

类型说明
普通消息无特殊语义,最常用。
顺序消息保证同一队列内消息按发送顺序消费。
事务消息保证“本地事务 + 消息发送”的最终一致性。
延时消息指定延时时间后投递。

八、总结

  • MQ 解决解耦、异步、削峰三大问题。
  • 核心组件:Producer、Consumer、Broker、NameServer、Topic、Queue。
  • RocketMQ 架构:NameServer 路由 + Broker 存储 + 主从/Dledger 高可用。
  • 消费模式:集群消费和广播消费。
  • 后续需深入:消息不丢、重复消费、顺序、积压、事务消息。