RabbitMq学习 Exchange的四种类型和属性

Posted zhazhahui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RabbitMq学习 Exchange的四种类型和属性相关的知识,希望对你有一定的参考价值。

一、什么是Exchange

首先我们要了解到,RabbitMQ 是 AMQP(高级消息队列协议)的标准实现:

 

技术图片

从 AMQP 协议可以看出,Queue、Exchange 和 Binding 构成了 AMQP 协议的核心

  • Producer:消息生产者,即投递消息的程序。

  • Broker:消息队列服务器实体。

    • Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列

    • Binding:绑定,它的作用就是把 Exchange 和 Queue 按照路由规则绑定起来。

    • Queue:消息队列载体,每个消息都会被投入到一个或多个队列。

  • Consumer:消息消费者,即接受消息的程序。

二、Exchange的作用

    Exchange的主要作用还是为了解耦。

    AMQP 协议中的核心思想就是生产者和消费者的解耦,生产者不直接将消息投递给队列,而是将消息投递给Exchange,然后Exchange根据相应的路由规则投递给队列,最后队列将消息投递到消费者。

   举个生活中的例子,不是很恰当,但大概意思就是这样。将报纸、投递站、投递员、订阅报纸的用户分别看做生产者、exchange、队列以及消费者。

   报纸印刷后,会分发到投递站,投递站相当于exchange,会指定分发规则,例如,这一片区的报纸分给某个投递员,投递员拿到这些报纸后,对订阅了该报纸的这一片区的用户进行投递。

  当然这个队则有多种,例如将区域看做一个规则、将报纸种类看做规则、或者区域加种类混合规则。下面就详细介绍exchange的类型。

三、Exchange的类型

3.1    Fanout Exchange

         这是最简单的一种交换器,首先要知道一个概念-banding。banding是将exchange和队列绑定的一种队则,java中万物皆对象,所以这个绑定也看做一个对象。

         banding中还有个路由键的概念。就是即使交换机与队列进行了绑定,但是在某些场景下,我们不希望与交换机绑定的队列都能收到消息。所以就可以去指定一个路由键。

         在进行绑定的时候去指定路由键,在发送消息的时候指定Exchange、指定路由键,才可以正确的将消息发送到队列上。

         Fanout Exchange 比较特殊 会忽略路由键的设置,直接将 Message 广播到所有绑定的 Queue 中。

3.2  Direct Exchange

       Direct Exchange 是RabbitMq的模式模式,将Exchange和队列绑定的时候,需要指定路由键,并且在发消息的时候也需要指定路由键,并且路由键必须要完全一致。

      技术图片

例如指定了路由键是green,那么只有与exchange绑定并且路由键为green的队列才会收到消息。

3.3 Topic Exchange

    与Direct Exchange基本相同,唯一区别在于路由键。Topic exchange 的路由键可以去进行模糊匹配。

    *  表示一个单词的模糊匹配 例如,路由键是   *.apple.big  则表示第一个单词可以是任意的,只要后边单词完全匹配,就可以。

    #  表示完全模糊匹配。例如 路由键是 #.little ,那么 发送消息的路由键可以是 green,apple,little,也就是说前面的单词是任意的。

四、Exchange的使用

    多说无益,直接撸代码。

    就用topic 做演示,其他的模式基本一样。

   1. 首先设定一个路由键  

public static final String TOPIC_C = "red.*.*";

2.配置一个topicExchange
 @Bean
    public TopicExchange topicExchange() 
        return new TopicExchange(EXCHANGE_C);
    

  3. 配置一个队列

   第一个参数拜师队列名称,第二个参数表示是否持久化

   @Bean
    public Queue queueC() 
        return new Queue(QUEUE_C, false); //队列持久
    

4.   配置bangding

 

  @Bean
  public Binding bindingC() 
        return 
  BindingBuilder.bind(queueC()).to(topicExchange()).with(TOPIS_C);
    

 

5. 发送消息代码 

   第一个参数是Exchange名称,第二个参数是路由键,第三个参数是内容,第四个参数是唯一性id

   如果是 Fanout Exchange 那么就不用指定路由键传参为null,

    如果是 Direct Exchange,那么路由键就要与指定的路由键完全匹配。

   

public void sendMsg(String content) 
        CorrelationData correlationId = new CorrelationData(UUID.randomUUID().toString());
        rabbitTemplate.convertAndSend(EXCHANGE_C, "red.cc.dd", content, correlationId);

    

 

这样路由键是  red.*.*  ,发送消息的路由键是  "red.cc.dd" ,并且因为是Topic Exchange模式,所以该路由键是可以匹配到的。

 

完整代码请参考:https://github.com/zhuanzhiBUG/springboot-rabbitmq.git

 

部分参考内容:https://blog.csdn.net/y4x5M0nivSrJaY3X92c/article/details/80416996

 

  

 

以上是关于RabbitMq学习 Exchange的四种类型和属性的主要内容,如果未能解决你的问题,请参考以下文章

rabbitmq交换器的四种模式

rabbitmq交换器的四种模式

3.RabbitMQ 第一个程序

2021-06-30 .NET高级班 80-ASP.NET Core RabbitMQ的交换机的四种类型

rabbitMQ第四种模型(Routing)

rabbitMQ第四种模型(Routing)