1 名词解释

未匹配的标注

PHP

1.1 Broker

消息队列服务器实体。

1.2 vhost

虚拟主机。一个 broker 里可以开设多个 vhost,用作不同用户的权限分离。详情可查看官方文档

1.3 Connect

Connection 是 RabbitMQ 的 socket 链接,它封装了socket协议相关部分逻辑。

1.4 Channel

信道。客户端的每个连接可建立多个 Channel,每个 Channel代表一个会话任务。它建立在上述的 TCP 连接中,数据流动都是在 Channel中进行的。也就是说,一般情况是程序开始建立 TCP 连接,再建立 Channel。

Q:为什么使用 Channel,而不是直接使用 TCP 连接?

A: 对于 OS 来说,建立和关闭 TCP 连接是有代价的,频繁的建立关闭 TCP 连接对于系统的性能有很大的影响,而且 TCP 的连接数也有限制,这也限制了系统处理高并发的能力。但是,在 TCP 连接中建立 Channel是没有上述代价的。对于 Producer 或者 Consumer 来说,可以并发的使用多个 Channel 进行Publish 或者 Receive。

1.5 Queue

队列。用于存储消息,每个消息都会被投入到一个或多个队列。

1.6 Exchange

消息交换机。用来接收消息,转发消息到绑定的队列,是 rabbitMq 的核心。

交换机类型(Exchange Type)共有 4 种:fanout,direct,topic,headers。

1.6.1 fanout

广播式交换器,不处理路由键。它会将消息发送给绑定交换机的所有队列。如果将消息发送到一个没有队列绑定的 exchange 上面,那该消息将会丢失,这是因为在 rabbitmq 中 exchange 是不具备存储消息的能力,只有队具备存储消息的能力。伪代码如下:

// 声明交换机,交换机名:log,类型:fanout
exchange_declare(exchange_name="log", exchange_type="fanout")

// 队列 log.info 和 log.error 绑定交换机 log,不需要 routing key
queue_bind(queue_name='log.info', exchange_name='log');
queue_bind(queue_name='log.error', exchange_name='log');

// 生产者发送消息
basic_publish(message='test message', exchange_name='log'); 

// 结果
log.info 和 log.error 队列都会接收到消息 “test message”

1.6.2 direct

直接交换器(默认)。它会把消息路由到那些 Binding Key 与 Routing Key 完全匹配的 Queue 中。伪代码如下:

// 声明交换机,交换机名:log,类型:direct
exchange_declare(exchange_name="log", exchange_type="direct")

// 队列 log.info 和 log.error 绑定交换机 log,用 routing key 完全匹配
queue_bind(queue_name='log.info', exchange_name='log', routing_key='route_key_info');
queue_bind(queue_name='log.error', exchange_name='log', routing_key='route_key_error');

// 生产者发送消息
basic_publish(message='test message', exchange_name='log', routing_key='route_key_info');

// 结果
只有 log.info 队列会接收到消息 “test message”

1.6.3 topic

话题交换器。它会把消息路由到那些 Binding Key 与 Routing Key 模糊匹配的 Queue 中。Binding Key 中 * 用于匹配一个单词,# 用于匹配 0/1/多个单词,单词以符号 “.” 为分隔符。 伪代码如下:

// 声明交换机,交换机名:social,类型:topic
exchange_declare(exchange_name="social", exchange_type="topic")

// 队列 qq 和 wechat 绑定交换机 social,用 routing key 模糊匹配
queue_bind(queue_name='qq', exchange_name='social', routing_key='#.qq');
queue_bind(queue_name='wechat', exchange_name='social', routing_key='#.wechat.*');

// 生产者发送消息
basic_publish(message='这是QQ账号', exchange_name='social', routing_key='account.qq');
basic_publish(message='这是QQ临时会话消息', exchange_name='social', routing_key='temporary.msg.qq');
basic_publish(message='这是微信账号', exchange_name='social', routing_key='account.wechat');
basic_publish(message='这是微信好友', exchange_name='social', routing_key='account.wechat.friend');

// 结果
wechat 队列会接收到消息 “这是微信好友”
qq 队列会接收到消息 “这是QQ账号” 和 “这是QQ临时会话消息”

1.6.4 headers

headers 不依赖于Binding Key 与 Routing Key 的匹配规则来路由消息,而是根据发送的消息内容中的 headers 属性进行匹配。

在绑定 Queue 与 Exchange 时指定一组键值对,当消息发送到 Exchange 时,RabbitMQ 会取到该消息的 headers(也是一个键值对的形式),对比其中的键值对是否完全匹配 Queue 与 Exchange 绑定时指定的键值对。如果完全匹配则消息会路由到该 Queue,否则不会路由到该 Queue。(比较少用到,所以没有做测试)

1.7 Routing Key

路由关键字。生产者在将消息发送给 Exchange 的时候,一般会指定一个 Routing Key,来指定这个消息的路由规则,而这个 Routing Key 需要与 Exchange Type 及 Binding Key 联合使用才能最终生效。通过指定 Routing Key 可以决定消息流向哪里。

1.8 Binding Key

在绑定(Binding)Exchange 与 Queue 的时候,一般会指定一个 Binding Key;当 Binding Key 与 Routing Key 相匹配时,消息将会被路由到对应的 Queue 中。Binding Key 依赖于 Exchange Type,当交换机类型为 fanout 时,Exchange 就会无视 Binding Key,将消息路由到所有绑定到该 Exchange 的 Queue。

1.9 Producer

消息生产者,就是投递消息的程序。

1.10 Consumer

消息消费者,就是接受消息的程序。

如果文章有帮到你的话,别忘了点赞收藏噢 :smile:

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~