Vhost
虚拟主机(Virtual Host),类似于 Namespace 命名空间的概念,逻辑隔离,每个用户里可以创建多个 Vhost,每个 Vhost 可以创建若干个 Exchange 和 Queue。
Queue
消息队列,每个消息都会被投入到一个或者多个 Queue 里。
Producer
消息生产者,即投递消息的程序。
Consumer
消息消费者,即接受消息的程序。
Connection
TCP 连接,Producer 或 Consumer 与消息队列间的物理 TCP 连接。
Connection将应用与分布式消息服务RabbitMQ连接在一起。Connection会执行认证、IP解析、路由等底层网络任务。应用与分布式消息服务RabbitMQ建立Connection需要多个TCP报文交互,因而会消耗较多的网络资源和分布式消息服务RabbitMQ资源。大量的Connection会对分布式消息服务RabbitMQ造成巨大压力,甚至触发分布式消息服务RabbitMQ SYN洪水攻击防护,导致分布式消息服务RabbitMQ无响应,进而影响业务。
Channel
在客户端的每个物理 TCP 连接里,可建立多个 Channel,每个 Channel 代表一个会话任务。
Channel是物理TCP连接中的虚拟连接。当应用通过Connection与分布式消息服务RabbitMQ建立连接后,所有的AMQP协议操作(例如创建队列、发送消息、接收消息等)都会通过Connection中的Channel完成。Channel可以复用Connection,即一个Connection下可以建立多个Channel。Channel不能脱离Connection独立存在,而必须存活在Connection中。当某个Connection断开时,该Connection下的所有Channel都会断开。当大量应用需要与分布式消息服务RabbitMQ建立多个连接时,建议您使用Channel来复用Connection,从而减少网络资源和分布式消息服务RabbitMQ资源消耗。
Connection和Channel的使用建议
保持Connection长连接,请勿频繁开启或关闭Connection。如果确实需要频繁开启或关闭连接,请使用Channel。
一个进程对应一个Connection,一个进程中的多个线程则分别对应一个Connection中的多个Channel。
Producer和Consumer分别使用不同的Connection进行消息发送和消费。
Exchange
Producer 将消息发送到 Exchange ,由 Exchange 将消息路由到一个或多个 Queue 中(或者丢弃),Exchange 按照相应的 Binding 逻辑将消息路由到 Queue。
Exchange 类型
- Fanout:该类型路由规则非常简单,会把所有发送到该 Exchange 的消息路由到所有与它绑定的 Queue 中,相当于广播功能。
适用于广播消息的场景。
路由示例:
Message | Routing Key | Binding Key | Queue |
---|---|---|---|
Message A | key.a | key.c.# key.e |
Queue A Queue B |
Message B | key.b | key.c.# key.e |
Queue A Queue B |
- Direct:该类型路由规则会将消息路由到 Binding key 与 Routing key 完全匹配的 Queue 中。
适用于通过简单字符标识符区分消息的场景,常用于单播路由。
匹配示例:
Message | Routing Key | Binding Key | Queue |
---|---|---|---|
Message A | key.a | key.a | Queue A |
Message B | key.b | key.b | Queue B |
- Topic:该类型与 Direct 类型相似,只是规则没有那么严格,可以模糊匹配和多条件匹配,即该类型 Exchange 使用 Routing key 模式匹配和字符串比较的方式将消息路由至绑定的 Queue;
支持的通配符包括星号( )和井号(#)。星号( )代表一个英文单词(例如cn)。井号(#)代表零个、一个或多个英文单词,英文单词间通过英文句号(.)分隔;适用于通过通配符区分消息的场景,常用于多播路由。
路由示例:
Message | Routing Key | Binding Key | Queue |
---|---|---|---|
Message A | key.a.b | key.a.b.# | Queue A |
Message B | key.a.b.c | key.a.b.# key.a.*.c |
Queue A Queue B |
Message C | key.a.d.c | key.a.*.c | Queue B |
Binding
一套绑定规则,用于告诉 Exchange 消息应该被存储到哪个 Queue。它的作用是把 Exchange 和 Queue 按照路由规则绑定起来。
Routing Key
Producer 在发送消息给 Exchange 时,需要指定一个 Routing key 来设定该消息的路由规则,而 Routing key 需要与 Exchange 类型及 Binding key 联合使用才能生效;一般情况下,Exchange 类型与 Binding key 提供配置好,Producer 在发送消息给 Exchange 时,可以通过指定 Routing key 来决定消息投放到哪个 Queue。