#1. Producer:寄件商家
Producer 就是发消息的一方。
它不关心谁来处理,只关心“我把这个包裹交给调度中心了”。
比如:
- 电商系统发一个“创建运单”消息
- 支付系统发一个“支付成功”消息
- 管理后台发一个“导出报表”任务
它做的动作很简单:
channel.basic_publish(
exchange="parcel.dispatch",
routing_key="parcel.create",
body=b'{"order_id": 1001}'
)这里它做了三件事:
- 指定发往哪个交换机
- 给包裹贴上什么标签
routing_key - 放入消息内容
body
#2. Exchange:分拣大厅
Exchange 不是存储区,它更像“分拣规则引擎”。
它只负责一件事:
收到包裹后,决定把它送到哪些队列。
注意,它自己通常不长期存包裹;真正存消息的是 Queue。
所以你可以把 Exchange 理解成:
不是仓库
而是“分发规则表”#3. Queue:包裹货架
Queue 是真正放消息的地方。
消费者如果暂时没来,消息就先待在队列里。
等消费者来取,或者 RabbitMQ 主动投递给消费者后,再继续向下流转。
类比里它就是调度中心里的“待派送货架”。
Exchange 决定“进哪个货架”
Queue 决定“包裹先堆在哪”
Consumer 决定“谁来拿走处理”#4. Consumer:派送员 / 工人
Consumer 是取走消息并处理的人。
- 发短信的服务
- 生成 PDF 的服务
- 缩略图处理服务
- 发货系统
- 邮件通知服务
都可以是 Consumer。
一个队列可以有多个消费者,但要区分两种心智:
- 多个消费者消费同一个队列:是竞争关系,通常一条消息只会被其中一个消费者处理
- 多个队列分别绑定同一个交换机:才是广播复制,多个系统都能收到一份
这是 RabbitMQ 初学者最容易混淆的地方。
#5. Binding:分拣连接规则
Binding 是“交换机和队列之间的连接规则”。
你可以把它理解成:
这个货架愿不愿意接某类包裹例如:
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.createparcel.cancelorder.paiduser.avatar.resize
不同交换机类型,对 routing key 的使用方式不同:
direct:要求精确匹配fanout:直接忽略topic:按模式匹配