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 高可用。
  • 消费模式:集群消费和广播消费。
  • 后续需深入:消息不丢、重复消费、顺序、积压、事务消息。
相关推荐
Dovis(誓平步青云)1 小时前
家里设备越来越多,如何用一张空间地图控制灯光和温度![
android·java·前端·javascript·人工智能·电脑
嘎嘎风1 小时前
MiniMind 学习笔记之 04 注意力之外:位置、记忆、省显存、省时间、深加工
架构·源码阅读
yuniko-n1 小时前
【Java】字符串相关坑点
java·开发语言·python
Terra.K1 小时前
Spring AI day1(SSE+AI)
java·人工智能·spring·springai
斑鸠喳喳1 小时前
线程本地存储 ThreadLocal
java·后端
国科安芯2 小时前
商业立方星平台中高集成度抗辐射MCU的功耗优化与批量化应用可行性探讨
单片机·嵌入式硬件·架构·risc-v·抗辐射·as32x601
Wang's Blog2 小时前
Java框架 SpringCloud 快速入门: 服务拆分案例 Demo
java·开发语言·spring cloud
DongQiShanRen3 小时前
裁决台账双向互校(上):名册与实物的第一道对账
java·linux·运维·数据库·人工智能·自然语言处理·数据挖掘
cpolar技术支持3 小时前
Spring Boot 接口本地正常,异地前端却报跨域?用 cpolar 跑通 CORS 预检与白名单
java·springboot·cpolar·前后端分离·cors