Lecture01-RabbitMQ-概念与体系结构

文章目录

    [toc]

    单词词性音标含义
    message queuen./ˈmesɪdʒ kjuː/消息队列(应用之间异步通信的中间件)
    producern./prəˈdjuːsə(r)/生产者(发送消息的一方)
    consumern./kənˈsjuːmə(r)/消费者(接收并处理消息的一方)
    brokern./ˈbrəʊkə(r)/消息服务器主体(负责接收和分发消息)
    exchangen./ɪksˈtʃeɪndʒ/交换机(消息到达 Broker 的第一站,按规则分发)
    queuen./kjuː/队列(消息的容器,等待被消费)
    bindingn./ˈbaɪndɪŋ/绑定(交换机和队列之间的对应关系)
    channeln./ˈtʃænl/通道(Connection 内的逻辑连接,复用 TCP)

    Lecture01-RabbitMQ-概念与体系结构

    1、本节讲什么

    先用一张图建立对 RabbitMQ 的整体认知:它是什么、解决什么问题、由哪些部件组成。这一节不敲命令,只建立概念,为后面的安装和 SpringBoot 整合打基础。

    2、为什么需要消息队列(同步 vs 异步)

    先看一个场景:下单功能。同步方式里,下单请求要依次调"保存订单 → 更新库存 → 更新购物车 → 更新积分",一个做完才做下一个;异步方式里,只做核心的"保存订单",其余交给消息队列异步处理。

    同步 vs 异步对比:

    维度同步(OpenFeign 直调)异步(消息队列)
    功能耦合各模块串在一起,耦合度高各模块相对独立,解耦
    响应时间等所有步骤做完才返回(慢)只做核心步骤,快速返回
    并发压力压力沿调用链一路传导借助队列削峰限流
    扩展新功能要改下单代码新增模块对接队列即可,代码不动

    类比(丰巢柜):寄快递不用等收件人当场来取——把快递放进丰巢柜(消息队列),收件人方便时再来取。这就是"异步、解耦"。

    正确 vs 误区:

    • 并不是所有交互都改成异步;强关联(必须立刻拿到结果)仍用 OpenFeign 同步调用,弱关联、可独立拆分的功能才用消息队列异步。
    • 消息队列不是"让系统变快",而是"解耦 + 快速响应 + 削峰限流 + 便于扩展"。

    3、什么是消息队列

    消息队列是实现应用程序之间通信的中间件产品:发送方把消息放进队列,接收方从队列取走处理。它让两个应用不必同时在线、不必彼此直连。

    一句话:消息队列 = 一个"邮局/中转站",生产者和消费者通过它异步收发消息。

    4、RabbitMQ 简介

    • RabbitMQ 是一款基于 AMQP 协议、由 Erlang 语言开发的消息队列产品,2007 年发布 1.0 版本。
    • 官网:https://www.rabbitmq.com/
    • 我们用的是 RabbitMQ 4.x(本教程以 4.3 为例)。

    5、核心概念与体系结构

    对体系结构的理解直接关系到后续的操作和使用。先看图,再看表:

    RabbitMQ 体系结构

    核心部件一览:

    部件作用通俗理解
    Producer消息的发送端"发信的人"
    Consumer消息的接收端"收信的人"
    Connection客户端到 Broker 的 TCP 连接一条网络通道
    ChannelConnection 内的逻辑连接,复用 TCP通道里开的"子通道"
    BrokerRabbitMQ 服务器主体,接收和分发消息邮局总站
    Virtual Host虚拟分组,隔离不同项目/功能邮局里的不同"分柜"
    Exchange交换机,消息到达的第一站分拣中心
    Queue队列,消息的容器信箱
    Binding交换机与队列的对应关系"哪些信投哪个信箱"
    Routing Key路由键,交换机按它把消息送进队列信箱上的地址标签

    关于 Connection / Channel 的关键点:

    • 建立 TCP 连接要三次握手,反复建连接开销极大、效率低。
    • 所以在一个 Connection 内开多个 Channel,每个线程用独立 Channel 通信,实现 Connection 复用。
    • 每个 Channel 有自己的 id,Channel 之间完全隔离。

    消息流转:Producer 发消息到 Exchange → Exchange 按 Binding + Routing Key 把消息路由进 Queue → Consumer 从 Queue 取走消息。

    6、RabbitMQ 4 相对 3 的关键变化(重点)

    变化说明
    推荐 Quorum 队列生产高可用建议用 Quorum(仲裁)队列,天然防数据丢失;经典队列(Classic)仍是默认,但生产不推荐单靠手动持久化
    delayed_message 插件不维护RabbitMQ 3 里做延迟队列的 rabbitmq_delayed_message_exchange 插件,4 里官方已标记不再维护,不推荐新项目依赖
    TTL + 死信仍有效延迟队列仍可用 消息 TTL + 死信队列(DLX) 实现,经典队列和 Quorum 队列都支持
    延迟重试(4.3 新增)Quorum 队列新增原生延迟重试(消费失败后按退避间隔延迟重投)

    这些变化会在后面的章节里逐一落到操作上:Quorum 队列(Lecture05)、TTL+死信延迟队列(Lecture06)、Quorum 延迟重试(Lecture05)。

    7、常见疑问

    • Q:为什么消息队列能解耦? A:因为各模块不直接调用,只和队列打交道。加一个新模块(如数据统计),只需让它监听队列,下单代码一行不用改。
    • Q:Connection 和 Channel 啥关系? A:Connection 是一条 TCP 连接,Channel 是这条连接里的逻辑子通道。一条 Connection 开多个 Channel,避免频繁建 TCP 连接。
    • Q:Exchange 和 Queue 是什么关系? A:消息先到 Exchange(交换机),Exchange 按 Binding(绑定)和 Routing Key(路由键)决定把消息放进哪个 Queue。消费者从 Queue 取消息。
    • Q:本教程用哪个版本? A:RabbitMQ 4.3,用 Docker 安装(rabbitmq:4.3-management),自带 Management UI,方便可视化操作。

    8、本节验证

    • 说出消息队列解决的四个问题(解耦 / 快速响应 / 削峰限流 / 便于扩展)✅
    • 分清 Producer / Consumer / Broker / Exchange / Queue / Binding ✅
    • 说明 Connection 与 Channel 的关系(Connection 复用)✅
    • 说出 RabbitMQ 4 的关键变化(Quorum 队列、插件不维护、TTL+死信仍有效)✅
    end