消息队列Rabbitmq的交换器类型

1、交换器类型

在rabbitmq中,生产者的消息都是经过交换器来接收,而后再从交换器分发到不一样的队列中去,在分发的过程当中交换器类型会影响分发的逻辑。性能

rabitmq中的交换器有4种类型,分别为fanout、direct、topic、headers四种,其中前三种较为常见,后面一种用的比较少。测试

2、fanout

通常状况下交换器分发会先找出绑定的队列,而后再判断routekey,来决定是否将消息分发到某一个队列中;但若是交换器的类型为fanout,那么交换器就再也不判断routekey了,而是将消息直接分发到绑定的队列中去,以下测试代码code

Channel channel = connection.createChannel();    //在rabbitmq中建立一个信道
channel.exchangeDeclare("exchangeName", "fanout"); //建立一个type为fanout的交换器    
channel.queueDeclare("queueName");    //建立一个队列
channel.queueBind("queueName", "exchangeName", "routingKey");   //将队列和交换器绑定

3、direct

在类型为direct的状况下,交换器在分发消息的时候一样会先获取绑定的队列,而后还会再判断routeing;当交换器发现类型为direct判断routeing的规则是彻底匹配模式,只有消息彻底等于到routeing的时候,才会将消息分发到指定队列;rabbitmq

一个队列是能够指定多个路由键的,咱们假设有两个队列,分别是队列一队列二;在队列一中指定了三个路由键,分别是zhangsanlisi,wangwu,在队列二中指定了一个队列键lisi,指定多个路由键的代码以下所示:队列

Channel channel = connection.createChannel();    //在rabbitmq中建立一个信道
channel.exchangeDeclare("exchangeName", "direct"); //建立一个type为direct的交换器
channel.queueDeclare("queueName");    //建立一个队列
channel.queueBind("queueName", "exchangeName", "zhangsna");   //绑定并设置路由键
channel.queueBind("queueName", "exchangeName", "lisi");   //绑定并设置路由键
channel.queueBind("queueName", "exchangeName", "wangwu");   //绑定并设置路由键

当生产者发送了一条routeting为zhangsan的消息到交换器中,交换器在分发的时候只会把消息分发到队列一里面去,由于交换器在routeting匹配的时候只匹配到了队列一,所以队列二不会收到消息;路由

当生产者再次发送了一条routeting为lisi的消息到交换器中,交换器在分发的时候会把消息分发到队列一队列二两个队列里面去,由于交换器在routeting匹配的时候匹配都匹配成功,所以两个队列都收到了消息;it

4、topic

在类型为topic的状况下,交换器分发消息的时候也须要同时匹配bindKeyroutingKey;但与direct类型不一样的是当交换器发现类型为topic时候,判断routeing的规则是模糊匹配模式。io

rabitmq自定义了一套匹配规则,在这里我假设生产者发送了一个消息,其中的的routingKey为wiki.imooc.com,那么交换器为topic类型时候,想要获取到这条消息,能够用*号做为通配符,来指定routingKey,分别是*.*.com*.imooc.**wiki.imooc.*;一样也可使用#做为通配符来指定路由键,例如wiki.##.comroute

在上面的通配符列子中,咱们须要掌握这几点:channel

  • 路由键以.为分隔符,每个分隔符的表明一个单词
  • 通配符*匹配一个单词、通配符#能够匹配多个单词
  • *能够在routingKey和bindKey上使用,#只能用于RoutingKey中

5、headers

类型为headers的交换器与前面三种匹配方式彻底不同,它不依赖与bindingKey和routingKey,而是在绑定队列与交换器的时候指定一个键值对;当交换器在分发消息的时候会先解开消息体里的headers数据,而后判断里面是否有所设置的键值对,若是发现匹配成功,才将消息分发到队列中;这种交换器类型在性能上相对来讲较差,在实际工做中不多会用到。

6、小结

  1. 从消息分发的性能上来比较:fanout > direct > topic > headers
  2. topic的匹配规则只是用于消费者而不是生产者

做者:汤青松

日期:2020-05-09