RabbitMQ - 03 - Work消息模型

目录

部署demo项目

什么是Work消息模型

实现Work消息模型

1.创建队列

2.生产者代码

3.消费者代码

4.配置yml


部署demo项目

通过消息队列demo项目进行练习 相关配置看此贴 http://t.csdnimg.cn/hPk2T

注意 生产者消费者的yml文件也要配置好

什么是Work消息模型

工作(Work)消息模型是一种基本的消息队列模型,也称为任务队列模型。在工作消息模型中,多个消费者(workers)同时监听同一个队列,其中的消息将被平均分配给不同的消费者进行处理。

工作消息模型的特点包括:

  1. 消息队列:生产者将消息发送到一个共享的队列中。
  2. 多个消费者 :多个消费者同时监听这个队列,竞争消费消息。
  3. 消息分发 :消息将按照一定的算法均匀地分发给不同的消费者,每个消息只能被消费一次。
  4. 负载均衡:通过多个消费者来处理消息,实现负载均衡,提高系统的处理能力和效率。

在工作消息模型中,消息的处理是并发的,多个消费者可以同时处理不同的消息,从而加快消息处理速度。然而,由于消息的分发是平均的,可能会导致某些消费者处理的消息比较多,而其他消费者处理的消息比较少,因此在实际应用中需要根据业务需求和系统性能进行合理的调整和优化。

实现Work消息模型

1.创建队列

2.生产者代码

java 复制代码
package cn.itcast.mq.helloworld;

import org.junit.jupiter.api.Test;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.messaging.Message;
import org.springframework.messaging.converter.StringMessageConverter;

@SpringBootTest
public class SpringAMQPTest {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    //  work消息模型
    @Test
    void testWorkQueue() throws InterruptedException {
        String queueName = "work.queue";
        for (int i = 1; i < 51; i++) {
            String message = "hello, Work MQ - " + i;
            rabbitTemplate.convertAndSend(queueName,message);
            Thread.sleep(20);
        }
    }


}

3.消费者代码

java 复制代码
package cn.itcast.mq.lintener;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class MQListener {

    @RabbitListener(queues = "work.queue")
    public void listenWorkQueue1(String message) throws InterruptedException {
        log.info("消费者1收到了消息:........... {}", message);
        Thread.sleep(20);  // 每秒处理 50 条消息
//        System.out.println("消费者收到了消息: " + message);
    }

    @RabbitListener(queues = "work.queue")
    public void listenWorkQueue2(String message) throws InterruptedException {
        log.info("消费者2收到了消息: {}", message);
        Thread.sleep(200);     //   每秒处理 5 条消息
//        System.out.println("消费者收到了消息: " + message);
    }

}

4.配置yml

消费者的yml需要补充下面的配置

work消息模型是采用轮询的方式获取消息队列的消息的,如果一个服务器性能高,另一个低,性能高的就得等待性能低的读取完后才能接着读取下一个

加上这些代码就能实现能者多劳,性能高的多读取

如图 消息2读取一条 消息1已经读取了6条了

总结

Work模型的使用:

  • 多个消费者绑定到一个队列,同一条消息只会被一个消费者处理

  • 通过设置prefetch来控制消费者预取的消息数量

相关推荐
攒了一袋星辰几秒前
今日指数项目项目集成RabbitMQ与CaffienCatch
java·分布式·rabbitmq
wrx繁星点点7 分钟前
事务的四大特性(ACID)
java·开发语言·数据库
IT学长编程15 分钟前
计算机毕业设计 Java酷听音乐系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·音乐系统·计算机毕业设计选题
IT学长编程32 分钟前
计算机毕业设计 基于协同过滤算法的个性化音乐推荐系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·毕业论文·协同过滤算法·计算机毕业设计选题·个性化音乐推荐系统
小小娥子37 分钟前
Redis的基础认识与在ubuntu上的安装教程
java·数据库·redis·缓存
DieSnowK38 分钟前
[Redis][集群][下]详细讲解
数据库·redis·分布式·缓存·集群·高可用·新手向
几何心凉44 分钟前
已解决:org.springframework.web.HttpMediaTypeNotAcceptableException
java
华农第一蒟蒻1 小时前
Java中JWT(JSON Web Token)的运用
java·前端·spring boot·json·token
两点王爷1 小时前
使用WebClient 快速发起请求(不使用WebClientUtils工具类)
java·网络
计算机学姐1 小时前
基于SpringBoot+Vue的高校运动会管理系统
java·vue.js·spring boot·后端·mysql·intellij-idea·mybatis