文章目录
- 一,Exchange
- 二,Exchange的四种类型
- 1,direct
- 2,fanout
- 3,topic
- 三,实操
- 1,创建一个exchange
- 2,创建一个queue
- 3,将queue绑定到exchange
一,Exchange
AMQP 中消息的路由过程和 Java 开发者熟悉的 JMS 存在一些差别,AMQP 中增加了 Exchange 和 Binding 的角色。生产者把消息发布到 Exchange 上,消息最终到达队列并被消费者接收,而 Binding 决定交换器的消息应该发送到那个队列。
二,Exchange的四种类型
Exchange 分发消息时根据类型的不同的分发策略有区别,目前共四种类型:
- direct
- fanout
- topic
- headers。
Headers 匹配 AMQP 消息的 header 而不是路由键,headers 交换器完全一致,但性能差很多,所以直接用另外三种类型。
1,direct
Direct Exchange(直连交换机)是最简单的交换机类型,它会将消息路由到与routing key完全匹配的队列上。
也就是说,如果一个队列绑定到交换机上的binding key
为“dog”,那么:
- 只有当消息的
routing key
也为“dog”时,该消息才会被投递到这个队列中。 - 如果消息的
routing key
为“dog.puppy”或者“dog.guard”,则不会被投递给这个队列。
在图中可以看到,当消息的routing key等于KEY时,交换机会将消息发送到对应的队列中。如果一个队列绑定了交换机,并且要求路由键为"dog",那么只有当routing key标记为"dog"的消息才会被转发到这个队列,而不会转发"dog.puppy"或"dog.guard"等其他不完全匹配的消息。
2,fanout
图中展示了Fanout Exchange的工作原理,它将所有发送到该交换机的消息都转发到所有绑定的队列上去。
Fanout Exchange(扇出交换机)是 RabbitMQ 提供的一种非常简单且高效的交换机类型。它的基本思想是将接收到的所有消息广播给与之关联的所有队列,类似于子网内的广播通信方式。在这种模式下,不需要考虑任何路由键或者绑定规则,只要一个队列与 fanout 交换机进行了绑定,那么就可以接收到交换机转发过来的所有消息。
在图中,我们可以看到一个 fanout 交换机连接着三个队列。无论消息的 routing_key 是什么,只要消息被发送到了这个交换机,它就会被转发到所有的队列中去。这就像在一个局域网内进行广播一样,每台主机都会接收到一份复制的消息。
由于 fanout 交换机不需要执行任何复杂的路由逻辑,因此它是所有交换机类型中最快速的。如果你的应用场景只需要将消息广播给多个消费者,那么使用 fanout 交换机将会是一个很好的选择。
3,topic
这张图片展示的是一个主题交换机(Topic Exchange),它是RabbitMQ中一种常用的交换机类型。主题交换机通过模式匹配来决定将消息路由到哪个队列。
在图片中,我们能看到四个队列(Queues)分别绑定了不同的模式(Binding Key)。这些模式都是由单词组成的,单词之间用点号"."分隔。同时,主题交换机也支持两种通配符:
#
:匹配零个或多个单词;*
:匹配一个单词。
例如,队列1绑定了"usa.#“,这意味着它将接收所有以"usa.“开头的消息;队列2绑定了”.news”,表示它将接收所有包含"news"作为最后一个单词的消息;队列3绑定了"#.weather",意味着它将接收所有以".weather"结尾的消息;队列4绑定了"europe.#",因此它将接收所有以"europe."开头的消息。
接下来,我们看几个例子:
-
当一条消息的路由键(Routing Key)为"usa.news"时:
- 队列1(绑定键为"usa.#")可以接受,因为"usa.news"满足以"usa."开头;
- 队列2(绑定键为".news")也可以接受,因为它包含了"news"作为最后一个单词;
- 队列3(绑定键为"#.weather")不能接受,因为"usa.news"没有以".weather"结尾;
- 队列4(绑定键为"europe.#")也不能接受,因为"usa.news"并没有以"europe."开头。
-
当一条消息的路由键(Routing Key)为"europe.weather"时:
- 队列1(绑定键为"usa.#")不能接受,因为"europe.weather"并不以"usa."开头;
- 队列2(绑定键为".news")可以接受,因为它包含了"weather"作为最后一个单词;
- 队列3(绑定键为"#.weather")也能接受,因为"europe.weather"是以".weather"结尾的;
- 队列4(绑定键为"europe.#")可以接受,因为"europe.weather"以"europe."开头。
总的来说,主题交换机允许你定义一系列的过滤规则,使得消息能够更灵活地被路由到合适的队列。这对于处理具有相似性的不同消息非常有用,比如上述例子中的美国新闻和欧洲天气预报。
三,实操
1,创建一个exchange
在管理界面上,创建我们的第一个exchange
。
2,创建一个queue
3,将queue绑定到exchange
把创建的queue绑定到exchange。
结果是: