RabbitMQ笔记三:四种类型Exchange

Exchange概念

Exchange:交互机,根据路由键转发消息到绑定的队列。

RabbitMQ架构图

自己说说Exchange在RabbitMQ消息中间件中的作用:
服务器发送消息不会直接发送到队列中(Queue),而是直接发送给交换机(Exchange),然后根据确定的规则,RabbitMQ将会决定消息该投递到哪个队列。

这些规则称为路由键(routing key),队列通过路由键绑定到交换机上。

消息发送到服务器端(broker),消息也有自己的路由键(也可以是空),RabbitMQ也会将消息和消息指定发送的交换机的绑定(binding,就是队列和交互机的根据路由键映射的关系)的路由键进行匹配。如果匹配的话,就会将消息投递到相应的队列。

Exchange的类型主要有四种,分别是

Direct Exchange:将消息中的Routing key与该Exchange关联的所有Binding中的Routing key进行比较,如果相等,则发送到该Binding对应的Queue中。

Topic Exchange:将消息中的Routing key与该Exchange关联的所有Binding中的Routing key进行对比,如果匹配上了,则发送到该Binding对应的Queue中。

Fanout Exchange:直接将消息转发到所有binding的对应queue中,这种exchange在路由转发的时候,忽略Routing key

Headers Exchange:将消息中的headers与该Exchange相关联的所有Binging中的参数进行匹配,如果匹配上了,则发送到该Binding对应的Queue中。

查看exchanges属性,在管控台上查看http://192.168.1.131:15672/#/exchanges

管控台

创建一个exchange

相关属性的说明,如果有多个Virtual host,则还会有Virtual host属性。一般默认的Virtual host是"/",我们知道Virtual host可以做最小粒度的权限控制。

创建Virtual host的界面

  • Virtual host:属于哪个Virtual host。
  • Name:名字,同一个Virtual host里面的Name不能重复。
  • Durability: 是否持久化,Durable:持久化。Transient:不持久化。
  • Auto delete:当最后一个绑定(队列或者exchange)被unbind之后,该exchange自动被删除。
  • Internal: 是否是内部专用exchange,是的话,就意味着我们不能往该exchange里面发消息。
  • Arguments: 参数,是AMQP协议留给AMQP实现做扩展使用的。
    alternate_exchange配置的时候,exchange根据路由路由不到对应的队列的时候,这时候消息被路由到指定的alternate_exchange的value值配置的exchange上。(下面的博客会有说明这参数的具体使用)

我们设定一个Auto delete属性是Yes的exchange

绑定关系

unbing之后该exchange删除。

命令行查看exchange信息

使用命令查看exchanges列表,默认的Virtual host

[root@mqserver ~]# rabbitmqctl list_exchanges
Listing exchanges
amq.direct      direct
        direct
amq.match       headers
amq.rabbitmq.log        topic
amq.topic       topic
amq.headers     headers
amq.rabbitmq.trace      topic
amq.fanout      fanout

指定某个Virtual host的exchanges列表,我指定的事默认的Virtual host(/)

[root@mqserver ~]# rabbitmqctl list_exchanges -p /
Listing exchanges
amq.direct      direct
        direct
amq.match       headers
amq.rabbitmq.log        topic
amq.topic       topic
amq.headers     headers
amq.rabbitmq.trace      topic
amq.fanout      fanout

使用restful api查看exchanges列表,api的文档地址,(http://192.168.1.131:15672/api/)

对应着下面的链接,当前管控台的url/api

 

具体的地址,输入对应的用户名和密码,看到对应用户的exchanges列表

http://192.168.1.131:15672/api/exchanges

Direct Exchange

将消息中的Routing key与该Exchange关联的所有Binding中的Routing key进行比较,如果相等,则发送到该Binding对应的Queue中。

  1. 一个Exchange可以Binding一个或多个Queue
  2. 绑定可以指定Routing keyBinding的多个Queue可以使用相同的Routing key,也可以使用不同的Routing key

创建三个Exchange,名称分别是login,logout,register三个exchange。

创建几个Queue,名称分别是PCWAPAPPOA

指定它们的Binding关系,

测试:

 

login exchange的绑定关系

查看队列中的消息

其他的可自行测试

特别的Exchange
默认的Exchange(名字为空,AMQP default)

  1. 默认的Exchange不能进行Binding操作
  2. 任何发送到该Exchange的消息都会被转发到Routing key指定的Queue
  3. 如果vhost中不存在Routing key中指定的队列名,则该消息会被抛弃。

指定到OA队列中

队列为OA接收到该消息

Topic Exchange

将消息中的Routing key与该Exchange关联的所有Binding中的Routing key进行对比,如果匹配上了,则发送到该Binding对应的Queue中。

匹配规则

* 匹配一个单词
# 匹配0个或多个字符
*,# 只能写在.号左右,且不能挨着字符
单词和单词之间需要用.隔开。

列子

  • Routing key是user.log.#,因为#是匹配0个或多个字符,所以下面的可以匹配:
user.log
user.log.info
user.log.a
user.log.info.login
  • Routing key是user.log.,因为 匹配一个单词,所以
user.log.info 可以匹配
user.log 不能匹配
user.log.info.login 不能匹配,二个单词
  • Routing key是#.log.#
    可以匹配:
log
user.log
log.info
user.log.info
user.log.info.a
  • Routing key是.log.
log 不匹配
user.log 不匹配
log.info 不匹配
user.log.info 匹配,前后各一个单词
user.log.info.a 不匹配
a.user.log.info 不匹配
  • Routing key是*.action.#
action 不符合
action.log 不符合
user.action.log 符合
user.action.log.info 符合
user.action 符合
user.log.action 不符合
  • Routing key是#.action.*
action 不符合
user.action 不符合
user.action.action 符合
user.action.login 符合
user.action.login.count 不符合
  • Routing key是* 表示匹配一个单词
  • Routing key是#,或者#.# 表示匹配所有

如果指定了Exchange是Topic类型的,但是相应的Binding中的Routing key *#都没有,则相等才转发,类似于Direct Exchange
如果Binding中的Routing key#或者#.#,则全部转发,类似Fanout Exchange(下面会讲到)

测试:
建立一个名称为logtopic类型的Exchange

新建三个队列q1,q2,q3分别绑定 * ,#,#.#

定义的exchange与queue及Routing key

自己定义一脚本,便于测试的时候清除所有队列的消息:

cd /u01
vim purge.sh
curl -X DELETE -u zhihao.miao:123456 http://192.168.1.131:15672/api/queues/%2F/q1/contents
curl -X DELETE -u zhihao.miao:123456 http://192.168.1.131:15672/api/queues/%2F/q2/contents
curl -X DELETE -u zhihao.miao:123456 http://192.168.1.131:15672/api/queues/%2F/q3/contents
curl -X DELETE -u zhihao.miao:123456 http://192.168.1.131:15672/api/queues/%2F/action_queue/contents
curl -X DELETE -u zhihao.miao:123456 http://192.168.1.131:15672/api/queues/%2F/log2_queue/contents
curl -X DELETE -u zhihao.miao:123456 http://192.168.1.131:15672/api/queues/%2F/log_queue/contents
curl -X DELETE -u zhihao.miao:123456 http://192.168.1.131:15672/api/queues/%2F/sys_log_info_queue/contents
curl -X DELETE -u zhihao.miao:123456 http://192.168.1.131:15672/api/queues/%2F/sys_log_queue/contents
curl -X DELETE -u zhihao.miao:123456 http://192.168.1.131:15672/api/queues/%2F/user2_queue/contents
curl -X DELETE -u zhihao.miao:123456 http://192.168.1.131:15672/api/queues/%2F/user_action_queue/contents
curl -X DELETE -u zhihao.miao:123456 http://192.168.1.131:15672/api/queues/%2F/user_log_debug_queue/contents
curl -X DELETE -u zhihao.miao:123456 http://192.168.1.131:15672/api/queues/%2F/user_log_info_queue/contents
curl -X DELETE -u zhihao.miao:123456 http://192.168.1.131:15672/api/queues/%2F/user_log_queue/contents
curl -X DELETE -u zhihao.miao:123456 http://192.168.1.131:15672/api/queues/%2F/user_queue/contents

给脚本授权

chmod 777 purge.sh

执行脚本

sh purge.sh

测试发送Routing key为这些的消息。

user
user.log
user.log.info
user.log.debug
sys
sys.log.debug

特殊情况,定义一队列q4exchange指定bindingreg,没有*#,那么当发送的消息route keyreg的时候,能够发送到q4上,此时类似于Direct Exchange

总结
topic Exchange可以实现Direct ExchangeFanout Exchange的效果。

Fanout Exchange

直接将消息转发到所有binding的对应queue中,这种exchange在路由转发的时候,忽略Routing key

Fanout Exchange这种exchange效率最高,fanout > direct > topic

定义一个Fanout类型的Exchange,绑定了一些队列,发送的时候全部队列都能收到消息,而与其bind或者发送消息指定的Routing key无关。

使用topic Exchange实现Fanout Exchange
topic Exchange将所有bindingqueuerouting key都指定为#或者#.#,此时消息也是全部转发。

Headers Exchange

将消息中的headers与该Exchange相关联的所有Binging中的参数进行匹配,如果匹配上了,则发送到该Binding对应的Queue中。

匹配规则:
如果Binding中的
x-match = all:表示所有的键值对都匹配才能转发到消息。
x-match = any: 表示只要有键值对匹配就能转发消息。

注意:

  1. Binging的时候,至少需要指定两个参数,其中的一个是x-match = allx-match = any
  2. Binging的时候,不需要指定Routing key
  3. 发送消息的时候,不需要指定Routing key
  4. 转发消息的时候,忽略Routing key
  5. 如果是x-match = all则发送的headers不能比bingding的参数少,否则匹配不上。

列子:

 

此时header.debug符合条件,收到消息。

此时还是header.debug符合条件,收到消息。

此时header.debug和header.error都收到消息。

此时header.debug和header.error都收到消息。

 

17人点赞

 

RabbitMQ学习

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值