RabbitMQ六种工作模式 您所在的位置:网站首页 配置交换机有哪几种方法 RabbitMQ六种工作模式

RabbitMQ六种工作模式

2023-09-20 15:40| 来源: 网络整理| 查看: 265

🚨 如果你还不清楚RabbitMQ中的四种交换机类型,阅读该文之前建议先了解一下RabbitMQ中四种交换机类型,相关知识查看笔者另一篇文章👉RabbitMQ四种交换机类型)

🎏RabbitMQ六种工作模式 一、simple简单模式

image.png

simple模式是一种简单的收发模式,如上图所示P代表消息生产者、红色部分为消息队列,C为消息消费者,到这里你会问,那交换机呢?在simple模式下我们无需指定交换机,RabbitMQ会通过默认的default AMQP交换机将我们的消息投递到指定的队列,它是一种Direct类型的交换机,队列与它绑定时的binding key其实就是队列的名称。更多的知识可以看我的另一篇文章,里面有详细介绍👉RabbitMQ四种交换机类型)

image.png

代码实现 首先,先定义一个队列queue5,无需定义交换机 //simple模式 @Bean public Queue queue5(){ return new Queue("queue5"); } 生产者 @Test void contextLoads() { //无需指定交换机,传入空字符串 //发送消息到队列queue5,这里的queue5其实就是routing key //和队列与默认交换机绑定时的binding key相同时消息才能被投递queue5 rabbitTemplate.convertAndSend("","queue5","不喝奶茶的Programmer"); } 消费者 @Component public class Consumer1 { @RabbitListener(queues = "queue5") public void receiverMessage(Object msg, Channel channel,Message message) throws IOException { System.out.println("收到消息:"+msg); channel.basicAck(message.getMessageProperties().getDeliveryTag(),false); } } 程序输出: 成功投递 收到消息:(Body:'不喝奶茶的Programmer' MessageProperties [headers={}, contentType=text/plain, contentEncoding=UTF-8, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false, receivedExchange=, receivedRoutingKey=queue5, deliveryTag=1, consumerTag=amq.ctag-Kmxu_O-84ooZv_N2AjkkEg, consumerQueue=queue5])

从运行结果可以看出,我们在没有定义声明交换机的情况下,消息也是能够被成功投递到队列,且消费者能从中消费消息,从而也印证了我们上面所说的,simple模式下其实是采用默认的交换机来将消息投递到队列的,而不是说没有交换机。

二、work模式

image.png

image.png

work模式采用的也是默认的default AMQP交换机。work模式下,多个消费者可以监听同一个队列,这时Queue中的消息会被平均分摊给多个消费者进行处理,而不是每个消费者都收到所有的消息并处理。当有多个消费者时,我们的消息会被哪一个消费者消费呢,应该如何均衡消费者消费信息的多少呢?

work主要有两种模式:

🚗轮询分发:一个消费者消费一条,按均分配,woek模式下默认是采用轮询分发方式。轮询分发就不写代码演示了,比较简单,比如生产费者发送了6条消息到队列中,如果有3个消费者同时监听着这一个队列,那么这3个消费者每人就会分得2条消息。下面主要介绍公平分发。

✈公平分发:根据消费者的消费能力进行公平分发,处理得快的分得多,处理的慢的分得少,能者多劳。

公平分发模式 公平分发模式下我们需要修改RabbitMQ的配置,第一是将消息确认模式改为手动确认,第二是将预处理模式更改为每次读取1条消息,在消费者未返回确认之前,不再进行下一条消息的消费,修改后的配置文件如下: spring: #RabbitMq配置 rabbitmq: host: 192.168.180.130 port: 5672 username: admin password: admin virtual-host: / #消息确认回调 publisher-confirm-type: correlated #消息失败回调 publisher-returns: true # 消费者监听 listener: simple: #消费者手动确认 acknowledge-mode: manual #预处理模式,每次读取1条消息,在消费者未返回确认之前,不再处理下一条消息 prefetch: 1

接着我们让生产者投递4条消息到队列中,准备两个消费者来消费队列中的消息。

生产者: @Test void contextLoads() { //发送消息到队列queue5,这里的queue5其实就是routing key //和队列与默认交换机绑定时的binding key相同时消息才能被投递queue5 for (int i = 1; i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有