美文网首页
消息队列Rabbitmq的交换器类型

消息队列Rabbitmq的交换器类型

作者: 汤青松daxia | 来源:发表于2020-05-09 11:29 被阅读0次

    一、交换器类型

    在rabbitmq中,生产者的消息都是通过交换器来接收,然后再从交换器分发到不同的队列中去,在分发的过程中交换器类型会影响分发的逻辑。

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

    二、fanout

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

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

    三、direct

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

    一个队列是可以指定多个路由键的,我们假设有两个队列,分别是队列一队列二;在队列一中指定了三个路由键,分别是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匹配的时候匹配都匹配成功,因此两个队列都收到了消息;

    四、topic

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

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

    在上面的通配符列子中,我们需要掌握这几点:

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

    五、headers

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

    六、小结

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

    作者:汤青松

    日期:2020-05-09

    相关文章

      网友评论

          本文标题:消息队列Rabbitmq的交换器类型

          本文链接:https://www.haomeiwen.com/subject/ecohnhtx.html