RabbitMQ工作模式

上文:RabbitMQ生产者producer, consumer实现

代码地址: https://gitee.com/never_enough/rabbitmqtest

参考RabbitMQ官网: RabbitMQ Tutorials

1. Work queues 工作队列模式

参考官网:RabbitMQ Tutorials

在这里插入图片描述

  • 工作模式是一个或者多个消费者共同消费一个队列中的消息;

  • 队列中的每一个消息只可能被其中一个消费者消费;

简单比如,多个人吃一个蛋糕;

应用场景:对于消息任务很多的情况,可以使用工作队列提高任务处理的速度;

原理就是集群处理大量的消息

下面再创建一个消费者:
在这里插入图片描述
循环发送多条消息,结果如下图:
在这里插入图片描述

2. Publish/Subscribe 发布订阅模式

在这里插入图片描述

2.1 修改RabbitMQConfig配置文件

	/**
     * fanout交换机名称  ( fanout: 广播)
     */
    public static final String FANOUT_EXCHANGE="fanoutExchange";

	 /**
     * 订阅队列1名称
     */
    public static final String SUB_QUEUE1="subQueue1";

    /**
     * 订阅队列2名称
     */
    public static final String SUB_QUEUE2="subQueue2";

	/**
     * 定义一个fanout交换机
     * @return
     */
    @Bean
    public FanoutExchange fanoutExchange(){
        return new FanoutExchange(FANOUT_EXCHANGE);
    }

	/**
     * 定义一个订阅队列1
     * @return
     */
    @Bean
    public Queue subQueue1(){
        return new Queue(SUB_QUEUE1);
    }

    /**
     * 定义一个订阅队列2
     * @return
     */
    @Bean
    public Queue subQueue2(){
        return new Queue(SUB_QUEUE2);
    }

	/**
     * 定义一个队列和交换机的绑定
     *  广播: 由于交换机会把消息发送到所有绑定到这个交换机上的队列中,所有这种模式无需 ROUTINGKEY
     * @return
     */
    @Bean
    public Binding fanoutBinding1(){
        return BindingBuilder.bind(subQueue1()).to(fanoutExchange());
    }

    /**
     * 定义一个队列和交换机的绑定
     *  广播: 由于交换机会把消息发送到所有绑定到这个交换机上的队列中,所有这种模式无需 ROUTINGKEY
     * @return
     */
    @Bean
    public Binding fanoutBinding2(){
        return BindingBuilder.bind(subQueue2()).to(fanoutExchange());
    }
	

2.2 producer 发送广播消息

在这里插入图片描述

2.3 consumer 接收订阅的消息

在这里插入图片描述

2.4 测试

启动生产者服务后,发现控制台有100条尚未被消费:
在这里插入图片描述
下面再启动消费者服务:
在这里插入图片描述
这样同一条消息,两个订阅者就都能收到了

3. Routing 路由模式

在这里插入图片描述
路由模式

跟订阅模式类似,只不过在订阅模式的基础上加上了类型,订阅模式是分发到所有绑定到交换机的队列,路由模式只分发到绑定在交换机上面指定路由键的队列

3.1 配置RabbitMQConfig

	/**
     * direct交换机名称1
     */
    public static final String DIRECT_EXCHANGE1="directExchange1";

	/**
     * direct队列名称1
     */
    public static final String DIRECT_QUEUE1="directQueue1";

    /**
     * direct队列名称2
     */
    public static final String DIRECT_QUEUE2="directQueue2";

	/**
     * 定义一个direct交换机1
     * @return
     */
    @Bean
    public DirectExchange directExchange1(){
        return new DirectExchange(DIRECT_EXCHANGE1);
    }
	/**
     * 定义一个direct1队列
     * @return
     */
    @Bean
    public Queue directQueue1(){
        return new Queue(DIRECT_QUEUE1);
    }

    /**
     * 定义一个direct2队列
     * @return
     */
    @Bean
    public Queue directQueue2(){
        return new Queue(DIRECT_QUEUE2);
    }
	
	/**
     * 定义一个队列和交换机的绑定
     * @return
     */
    @Bean
    public Binding directBinding1(){
        return BindingBuilder.bind(directQueue1()).to(directExchange1()).with("error");
    }

    /**
     * 定义一个队列和交换机的绑定
     * @return
     */
    @Bean
    public Binding directBinding2(){
        return BindingBuilder.bind(directQueue2()).to(directExchange1()).with("info");
    }

    /**
     * 定义一个队列和交换机的绑定
     * @return
     */
    @Bean
    public Binding directBinding3(){
        return BindingBuilder.bind(directQueue2()).to(directExchange1()).with("error");
    }

    /**
     * 定义一个队列和交换机的绑定
     * @return
     */
    @Bean
    public Binding directBinding4(){
        return BindingBuilder.bind(directQueue2()).to(directExchange1()).with("warning");
    }

3.2 producer

在这里插入图片描述
启动producer服务,到控制台查看如下图:
在这里插入图片描述
可以发现有两个队列绑定到了这个交换机上:
在这里插入图片描述
在这里插入图片描述
队列2和队列1也分别有一条消息了。

3.3 consumer

在这里插入图片描述

4. Topic主题模式模糊匹配

在这里插入图片描述
主题模式和路由模式很像:

路由模式是精确匹配

主题模式是模糊匹配,更加灵活,更加强大;

主题模式的交换机类型是topic类型 通过通配符方式,消息路由到匹配的队列中。

  • 匹配一个单词;
  • 匹配零个或者多个单词;

在这里插入图片描述

4.1 配置RabbitMQConfig

	/**
     * topic队列名称1
     */
    public static final String TOPIC_QUEUE1="topicQueue1";
    /**
     * topic队列名称2
     */
    public static final String TOPIC_QUEUE2="topicQueue2";
    /**
     * TOPIC交换机名称
     */
    public static final String TOPIC_EXCHANGE="topicExchange";

    /**
     * 定义一个topic队列1
     * @return
     */
    @Bean
    public Queue topicQueue1(){
        return new Queue(TOPIC_QUEUE1);
    }
    /**
     * 定义一个topic队列2
     * @return
     */
    @Bean
    public Queue topicQueue2(){
        return new Queue(TOPIC_QUEUE2);
    }

    /**
     * 定义一个topic交换机
     * @return
     */
    @Bean
    public TopicExchange topicExchange(){
        return new TopicExchange(TOPIC_EXCHANGE);
    }

    /**
     * 定义一个队列和交换机的绑定
     * @return
     */
    @Bean
    public Binding topicBinding1(){
        // * 匹配一个单词
        return BindingBuilder.bind(topicQueue1()).to(topicExchange()).with("*.orange.*");
    }

    /**
     * 定义一个队列和交换机的绑定
     * @return
     */
    @Bean
    public Binding topicBinding2(){
        // * 匹配一个单词
        return BindingBuilder.bind(topicQueue2()).to(topicExchange()).with("*.*.rabbit");
    }

    /**
     * 定义一个队列和交换机的绑定
     * @return
     */
    @Bean
    public Binding topicBinding3(){
        // # 匹配零个或者多个单词
        return BindingBuilder.bind(topicQueue2()).to(topicExchange()).with("lazy.#");
    }

4.2 producer

在这里插入图片描述
启动生产者服务,rabbitmq控制台查看如下:
在这里插入图片描述
交换机:
在这里插入图片描述

4.3 consumer

在这里插入图片描述
下面启动消费者服务:
在这里插入图片描述

4.4 其他routing key测试

然后可以把下面几种routing key分别测试一下:
在这里插入图片描述

参考rabbitMQ官网: example

参考学习视频: bilibili.com/video/BV13K4y1H7Zh?p=10

RabbitMQ提供了6种工作模式,包括简单模式work queues、Publish/Subscribe发布与订阅模式、Routing路由模式、Topics主题模式、RPC远程调用模式(不太符合MQ)。这些模式分别具有不同的特点和使用场景。简单模式是最基本的模式,消息发送到队列中被消费者接收。工作队列模式是多个消费者共同消费一个队列中的消息。Publish/Subscribe发布与订阅模式中,生产者将消息发送到交换机,然后交换机将消息广播给所有绑定的队列。Routing路由模式是生产者选择将消息发送到特定的路由键上,消费者通过绑定队列和路由键来接收消息。Topics主题模式类似于Routing模式,但是可以使用通配符进行匹配路由键。RPC远程调用模式用于远程调用服务,不太符合消息队列的特点。 可以看出,这些模式在消息的传输、消费者的数量、消息的路由等方面有所不同。工作队列模式不需要定义交换机,而发布/订阅模式需要定义交换机。发布/订阅模式是面向交换机发送消息,而工作队列模式是面向队列发送消息(底层使用默认交换机)。发布/订阅模式需要设置队列和交换机的绑定,而工作队列模式不需要设置,实际上工作队列模式会将队列绑定到默认的交换机。 综上所述,RabbitMQ工作模式包括简单模式work queues、Publish/Subscribe发布与订阅模式、Routing路由模式、Topics主题模式、RPC远程调用模式。每种模式在实际应用中有不同的用途和特点,可以根据具体需求选择合适的工作模式。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [RabbitMQ工作模式](https://blog.csdn.net/weixin_42440154/article/details/124689685)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [RabbitMQ六种工作模式详解](https://blog.csdn.net/qq_44760609/article/details/125084962)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值