核心模型与消息路由
核心对象
| 对象 | 作用 |
|---|---|
| Producer | 发布消息到 Exchange |
| Exchange | 根据类型、Routing Key 和 Binding 路由消息 |
| Queue | 保存等待投递的消息 |
| Binding | 建立 Exchange 到 Queue 或 Exchange 的路由关系 |
| Consumer | 从 Queue 接收消息并 Ack/Nack |
| Connection | 客户端到 Broker 的 TCP 连接 |
| Channel | 复用 Connection 的轻量协议会话 |
| Virtual Host | 隔离 Exchange、Queue、Binding 和权限的逻辑租户 |
Producer 通常不直接发送到 Queue,而是发送到 Exchange。消息没有匹配的 Queue 时,是否退回或丢弃取决于 mandatory、Alternate Exchange 等配置。
Exchange 类型
| 类型 | 路由规则 | 典型场景 |
|---|---|---|
| Direct | Binding Key 与 Routing Key 精确匹配 | 按业务类别路由 |
| Topic | 使用 * 和 # 做分段模式匹配 | 多维事件订阅 |
| Fanout | 忽略 Routing Key,广播到全部绑定 | 广播通知 |
| Headers | 按消息 Header 匹配 | 不适合用字符串 Key 表达的规则 |
Topic Exchange 中 * 匹配一个单词,# 匹配零个或多个单词,单词以点分隔。
Connection 与 Channel
Connection 建立和维护成本较高,应用通常复用少量长连接,并为并发操作创建 Channel。Channel 不是线程安全的共享对象,通常不要让多个发布线程无保护地复用同一个 Channel。
大量短连接或 Channel 泄漏会消耗文件描述符、内存和调度资源。连接恢复后,还应确认队列、Consumer 和 Publisher Confirm 状态是否正确恢复。
Queue 声明
- Durable:Broker 重启后保留 Queue 元数据;
- Exclusive:只允许声明它的 Connection 使用,连接关闭后删除;
- Auto-delete:最后一个 Consumer 取消后满足条件时删除;
- Arguments:队列类型、TTL、最大长度、死信等策略。
Durable Queue 不代表其中每条消息都持久化;消息还需要以持久化 Delivery Mode 发布,并配合 Confirm 和高可用队列评估可靠性。
消费与顺序
多个 Consumer 订阅同一 Queue 时,消息会在它们之间分发。需要广播时,应为每个订阅者建立独立 Queue,并绑定到同一 Exchange。
basic.qos 的 Prefetch 限制未确认消息数量。Queue 有入队顺序,但多 Consumer、重试、重新入队、优先级和故障恢复都会影响端到端顺序。