RabbitMQ中的常用交换器

  • 概述
  • fanout
  • direct
  • topic
  • headers(不推荐)


概述

RabbitMQ常用的交换器类型有fanout、direct、topic、headers这四种(AMQP规范里还提到两种 Exchange Type,分别为 system 与 自定义,这里不予以描述)。

fanout

fanout 类型的Exchange路由规则非常简单,它会把所有发送到该Exchange的消息路由到所有与它绑定的Queue中,不需要做任何判断操作,所以fanout类型是所有的交换机类型里面速度最快的。fanout类型常用来广播消息。

direct

direct类型的Exchange路由规则也很简单,它会把消息路由到那些Bindingkey与RoutingKey完全匹配的Queue中。

direct 类型交换器图示:

springboot搭建rabbitmq 交换机 rabbitmq交换器有哪些_发送消息


以上图为例,如果发送消息的时候设置路由键为“warning”,那么消息会路由到Queue1和Queue2。如果在发送消息的时候设置路由键为"Info”或者"debug”,消息只会路由到Queue2。如果以其他的路由键发送消息,则消息不会路由到这两个队列中。

direct 类型常用于处理有优先级的任务,根据任务的优先级把消息发送到对应的队列,这样可以指派更多的资源去处理高优先级的队列。

topic

前面讲到direct类型的交换器路由规则是完全匹配BindingKey和RoutingKey ,但是这种严格的匹配方式在很多情况下不能满足实际业务的需求。topic类型的交换器在匹配规则上进行了扩展,它与direct 类型的交换器相似,也是将消息路由到BindingKey和 RoutingKey 相匹配的队列中,但这里的匹配规则有些不同,它约定:

RoutingKey 为一个点号“.”分隔的字符串(被点号“.”分隔开的每一段独立的字符串称为一个单词),如 “com.rabbitmq.client”、“java.util.concurrent”、“com.hidden.client”;

BindingKey 和 RoutingKey 一样也是点号“.”分隔的字符串;

BindingKey 中可以存在两种特殊字符串“”和“#”,用于做模糊匹配,其中“”用于匹配一个单词,“#”用于匹配多个单词(可以是零个)。

topic 类型交换器图示:

springboot搭建rabbitmq 交换机 rabbitmq交换器有哪些_RabbitMQ_02


以上图为例:

路由键为 “com.rabbitmq.client” 的消息会同时路由到 Queuel 和 Queue2;

路由键为 “com.hidden.client” 的消息只会路由到 Queue2 中;

路由键为 “com.hidden.demo” 的消息只会路由到 Queue2 中;

路由键为 “java.rabbitmq.demo” 的消息只会路由到Queuel中;

路由键为 “java.util.concurrent” 的消息将会被丢弃或者返回给生产者(需要设置 mandatory 参数),因为它没有匹配任何路由键。

headers(不推荐)

headers类型的交换器不依赖于路由键的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配。在绑定队列和交换器时制定一组键值对,当发送消息到交换器时,RabbitMQ会获取到该消息的headers(也是一个键值对的形式)'对比其中的键值对是否完全匹配队列和交换器绑定时指定的键值对,如果完全匹配则消息会路由到该队列,否则不会路由到该队列。headers类型的交换器性能会很差,而且也不实用,基本上不会看到它的存在