RabbitMQ系列02 - RabbitMQ 消息模型:Broker、交换器、队列与收发路径

张开发
2026/4/13 11:10:15 15 分钟阅读

分享文章

RabbitMQ系列02 - RabbitMQ 消息模型:Broker、交换器、队列与收发路径
RabbitMQ 消息模型Broker、交换器、队列与收发路径RabbitMQ是遵从AMQP 0-9-1的消息中间件Erlang实现消息先进入Exchange交换器再按类型与绑定规则路由到Queue队列。本文归纳核心对象、四种交换器、生产/消费典型步骤、Connection 与 Channel的分工以及客户端入口。帧级命令名与握手顺序以AMQP 0-9-1规范及RabbitMQ官方文档为准。目录RabbitMQ 与 AMQP 的定位核心对象一览交换器类型与路由行为topic 绑定键通配符路由示意Mermaid生产者从连接到入队消费者订阅、投递与确认Connection 与 Channel多消费者与轮询客户端入口多语言免责声明RabbitMQ 与 AMQP 的定位AMQPAdvanced Message Queuing Protocol面向消息中间件的开放应用层协议客户端与 Broker 可跨语言、跨厂商交互具体特性以0-9-1规范与实现为准。RabbitMQ实现 AMQP 的 Broker 之一另可通过插件支持STOMP、MQTT等但核心路由心智仍建议从 AMQP 模型理解。常见特点说明可靠性持久化、publisher confirm、消费者ACK等组合使用灵活路由Exchange Binding内置类型不足时可插件扩展扩展与高可用集群、经典镜像队列或Quorum Queue等随版本演进以文档为准可观测性管理插件、指标与日志核心对象一览对象角色Producer发消息负载常含payload与路由相关标签如 exchange、routing key。入队后消费者通常主要处理payload。Exchange路由中枢生产者不直接发队列概念上而是发到 Exchange。Queue存储消息与 Exchange 通过Binding关联。Binding声明 Exchange 与 Queue 的关系含binding key及参数。Consumer订阅 Queue接收投递确认后 Broker 可删除消息依ACK 模式。Broker服务实例口语上常叫「一台 RabbitMQ」。Routing key生产者发布时携带是否与binding key匹配、如何匹配取决于Exchange 类型。交换器类型与路由行为类型行为概要fanout忽略 routing key消息复制到所有绑定队列。directrouting key 与 binding key 完全相同的队列接收消息。topic点分词 通配符匹配见下节。headers按消息headers匹配不依赖 routing key复杂度和性能需自行评估生产相对较少用。默认交换器AMQP 规定存在名称为空的 direct 交换器用默认交换器发队列时routing key 常被当作队列名路由到对应队列便于入门复杂路由仍建议显式 Exchange。topic 绑定键通配符Routing key / binding key一般为.分隔的单词如orders.created.cn。符号含义*匹配恰好一个单词#匹配零个或多个单词多段示例教学用Binding key能匹配的 routing key 示例*.orange.*a.orange.blazy.#lazy、lazy.pink、lazy.pink.rabbit路由示意Mermaidpublish routing keybindingbindingProducerExchangeQueue 1Queue 2ConsumerConsumerfanout示意同一条消息进多队列Producerfanout XQ1Q2生产者从连接到入队典型顺序教学归纳与 Broker 建立TCP Connection创建Channel。声明 Exchange类型、持久化等。声明 Queue持久化、排他、自动删除等。QueueBind指定binding key及参数。Basic.Publish指定exchange、routing key、payload。Exchange 按规则将消息放入0…n 个队列。无匹配队列时行为依赖mandatory、备份交换器等配置可能回退或丢弃。关闭 Channel / Connection。Producer ──► Channel ──► Exchange ──► Queue0..n │ └── 声明、绑定、发布均在 Channel 上消费者订阅、投递与确认Connection Channel。可选Basic.Qosprefetch限制未ACK的在途消息数利于公平分发与背压与 Broker 内部流控配合。Basic.Consume推模式或Basic.Get拉模式少用。收到Basic.Deliver后处理业务。Basic.Ack或Nack/Reject依场景与重试策略。关闭资源。Connection 与 Channel概念说明Connection到 Broker 的TCP 连接认证在其上完成。ChannelConnection 上的轻量虚拟连接有独立 ID绝大多数 AMQP 命令在 Channel 上发送避免每条命令都新建 TCP。实践多线程应用常为每个线程或有限个使用独立 Channel不要在多线程间共享同一个 Channel客户端库通常非线程安全。多消费者与轮询同一队列上挂多个消费者时Broker 常按Round-Robin在消费者间分配消息实现水平扩展。若各消息处理耗时差异大仅靠轮询可能导致慢消费者拖整体可配合prefetch1、拆分队列等策略优化。广播需求队列层不提供「一条消息同时被多个消费者各收一份」的默认语义可用fanout 多队列或MQTT等协议语义实现。客户端入口多语言语言常见客户端包名示例Javacom.rabbitmq.clientConnectionFactory、Connection、ChannelPythonpika或aio-pika.NETRabbitMQ.ClientGoamqp091等协议操作集中在ChannelConnection负责建 Channel 与生命周期。免责声明Quorum Queue、流控、集群行为随版本变化大部署与调优请以当前RabbitMQ官方文档为准。主题RabbitMQ、AMQP、Exchange、Queue、路由、Channel。

更多文章