全书目录

第二十一篇:RabbitMQ 完全指南 —— 城市智能快递调度中心宇宙

第二章:六个核心角色,一次性讲清

3 分钟 960 字 第 384 / 962 个阅读单元
#1. Producer:寄件商家

Producer 就是发消息的一方。
它不关心谁来处理,只关心“我把这个包裹交给调度中心了”。

比如:

  • 电商系统发一个“创建运单”消息
  • 支付系统发一个“支付成功”消息
  • 管理后台发一个“导出报表”任务

它做的动作很简单:

python
channel.basic_publish(
    exchange="parcel.dispatch",
    routing_key="parcel.create",
    body=b'{"order_id": 1001}'
)

这里它做了三件事:

  • 指定发往哪个交换机
  • 给包裹贴上什么标签 routing_key
  • 放入消息内容 body

#2. Exchange:分拣大厅

Exchange 不是存储区,它更像“分拣规则引擎”。

它只负责一件事:

收到包裹后,决定把它送到哪些队列。

注意,它自己通常不长期存包裹;真正存消息的是 Queue。

所以你可以把 Exchange 理解成:

text
不是仓库
而是“分发规则表”

#3. Queue:包裹货架

Queue 是真正放消息的地方。

消费者如果暂时没来,消息就先待在队列里。
等消费者来取,或者 RabbitMQ 主动投递给消费者后,再继续向下流转。

类比里它就是调度中心里的“待派送货架”。

text
Exchange 决定“进哪个货架”
Queue 决定“包裹先堆在哪”
Consumer 决定“谁来拿走处理”

#4. Consumer:派送员 / 工人

Consumer 是取走消息并处理的人。

  • 发短信的服务
  • 生成 PDF 的服务
  • 缩略图处理服务
  • 发货系统
  • 邮件通知服务

都可以是 Consumer。

一个队列可以有多个消费者,但要区分两种心智:

  • 多个消费者消费同一个队列:是竞争关系,通常一条消息只会被其中一个消费者处理
  • 多个队列分别绑定同一个交换机:才是广播复制,多个系统都能收到一份

这是 RabbitMQ 初学者最容易混淆的地方。


#5. Binding:分拣连接规则

Binding 是“交换机和队列之间的连接规则”。

你可以把它理解成:

text
这个货架愿不愿意接某类包裹

例如:

python
channel.queue_bind(
    queue="parcel.create.q",
    exchange="parcel.dispatch",
    routing_key="parcel.create"
)

意思是:

parcel.create.q 这个货架接到 parcel.dispatch 分拣大厅上,专门接收标签为 parcel.create 的包裹。


#6. Routing Key:包裹标签

Routing Key 就是包裹标签。

它不是业务内容本身,而是分拣提示信息

例如:

  • parcel.create
  • parcel.cancel
  • order.paid
  • user.avatar.resize

不同交换机类型,对 routing key 的使用方式不同:

  • direct:要求精确匹配
  • fanout:直接忽略
  • topic:按模式匹配