MQ 基础概念与架构

基础概念与架构

一、什么是消息队列

消息队列(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 高可用。
  • 消费模式:集群消费和广播消费。
  • 后续需深入:消息不丢、重复消费、顺序、积压、事务消息。
相关推荐
这个DBA有点耶8 分钟前
2026年国产数据库“实际用户增长最快”核验指南:口径优先级、可查数据与选型动作清单
数据库·mysql·架构
JMchen10 分钟前
【Jetpack 内核实战 08 】:组件整合——DataStore + Room 构建离线优先架构
架构·kotlin·android jetpack
郭小李14 分钟前
spring mvc 工作流程
java·spring·mvc
昭昭日月明38 分钟前
AI 时代的《重构》
设计模式·架构
SL_staff38 分钟前
BI大屏嵌入MES的登录态难题:JVS统一账号体系实战解法
java·数据分析·数据可视化
乌暮1 小时前
综合案例:宠物电商系统
java·开发语言·spring·mvc·restful·1024程序员节
诚心呈意共享外卖配送系统1 小时前
即时零售配送系统怎么选?一份可落地的技术选型评估清单
架构·系统架构·创业创新·零售
VimorphTech1 小时前
一段字幕太长,怎样拆句并安排显示时间?
java·spring boot
万联WANFLOW1 小时前
Kimi K3.1 Pro 接口接入指南:模型选型、费用计算与零数据保留
java·spring boot·python·安全·spring·大模型
瓶瓶持续学习中1 小时前
数字孪生与空间智能技术架构解析:五类厂商路线及选型方法
大数据·网络·架构