目的
在类型为 direct 的 exchange 下
- 绑定两个队列,其绑定的 routingkey 相同。
- 绑定两个队列,其绑定的 routingkey 不同。
对比观察消息的路由。
环境
实验室环境的一台正常运行的 Rabbit MQ 服务器。
过程
1 新建一个 Virtual Host ,名称为 test_vhost1 。
$ rabbitmqctl add_vhost test_vhost1
Creating vhost "test_vhost1" ...
2 在名称为 test_vhost1 的下 Virtual Host ,设置名称 admin 用户的权限为可进行任何操作。
$ rabbitmqctl set_permissions -p test_vhost1 admin ".*" ".*" ".*"
Setting permissions for user "admin" in vhost "test_vhost1" ...
3 在名称为 test_vhost1 的 Virtual Hosts 下新建一个 Exchange,名称为 test_exchange1 ,类型为 direct
4 在名称为 test_vhost1 的 Virtual Hosts 下新建一个 Queue 名称为 test_queue1 。
4.1 把 test_exchange1 交换机和 test_queue1 队列进行绑定,设置 routingkey 为 abc 。
4.2 查看交换机的绑定情况
$ rabbitmqctl list_bindings -p test_vhost1 source_name source_kind destination_name destination_kind routing_key arguments
Listing bindings ...
exchange test_queue1 queue test_queue1 []
test_exchange1 exchange test_queue1 queue abc []
4.3 在控制台 test_exchang1 的页面下发送一条消息,其 routingkey 是 abc。
4.4 查看结果,发现 test_queue1 队列能收到消息。
5 在名称为 test_vhost1 的 Virtual Hosts 下新建一个名称为 test_queue2 的队列。
5.1 把 test_exchange1 交换机和 test_queue2 队列进行绑定,设置 routingkey 为 abc。
5.2 查看交换机绑定情况
$ rabbitmqctl list_bindings -p test_vhost1 source_name source_kind destination_name destination_kind routing_key arguments
Listing bindings ...
exchange test_queue1 queue test_queue1 []
exchange test_queue2 queue test_queue2 []
test_exchange1 exchange test_queue1 queue abc []
test_exchange1 exchange test_queue2 queue abc []
5.3 在名称为 test_exchange1 的 Exchange 下发送一条消息,设置其 routingkey 为 abc。
5.4 查看结果,发现 test_queue1 和test_queue2 队列都能收到消息。
6 在名称为 test_vhost1 的 Virtual Hosts 下新建一个名称为 test_queue3 的队列。
6.1 把 test_exchange1 交换机和 test_queue2 队列进行绑定,设置 routingkey 为 abcd
6.2 查看交换机绑定情况
$ rabbitmqctl list_bindings -p test_vhost1 source_name source_kind destination_name destination_kind routing_key arguments
Listing bindings ...
exchange test_queue1 queue test_queue1 []
exchange test_queue2 queue test_queue2 []
exchange test_queue3 queue test_queue3 []
test_exchange1 exchange test_queue1 queue abc []
test_exchange1 exchange test_queue2 queue abc []
test_exchange1 exchange test_queue3 queue abcd []
6.3 在名称为 test_exchange1 的 Exchange 下发送一条消息,设置其 routingkey 为 abc
6.4 查看结果,发现只有 routingkey 为 abc 的队列 test_queue1 和 test_queue2 才能收到消息
7 在名称为 test_vhost1 的 Virtual Hosts 下新建一个 Queue, 名称为 test_queue4 。
7.1 把 test_exchange1 交换机和 test_queue4 队列进行绑定,设置其 routingkey 为 test_queue2
7.2 查看交换机绑定情况
$ rabbitmqctl list_bindings -p test_vhost1 source_name source_kind destination_name destination_kind routing_key arguments
Listing bindings ...
exchange test_queue1 queue test_queue1 []
exchange test_queue2 queue test_queue2 []
exchange test_queue3 queue test_queue3 []
exchange test_queue4 queue test_queue4 []
test_exchange1 exchange test_queue1 queue abc []
test_exchange1 exchange test_queue2 queue abc []
test_exchange1 exchange test_queue3 queue abcd []
test_exchange1 exchange test_queue4 queue test_queue2 []
7.3 在名称为 test_exchange1 的 Exchange 下发送一条消息,设置其 rouringkey 为 test_queue2
7.4 查看结果,发现只有队列名为 test_queue4 的队列能接收到消息
结论
在 direct 类型的 Exchange 下:
- 发送消息时 routingkey 与绑定队列的 routingkey 值相等,该类队列才会收取到消息。
- 发送消息时 routingkey 与绑定队列的 routingkey 值不相等,而是与绑定的队列名相等,该类队列不会收取到消息。
更多实验可点击:Rabbitmq 实验