WorkQueue

Work queues,也被称为(Task queues),任务模型。简单来说就是让多个消费者绑定到一个队列,共同消费队列中的消息

当消息处理比较耗时的时候,可能生产消息的速度会远远大于消息的消费速度。长此以往,消息就会堆积越来越多,无法及时处理。

此时就可以使用work 模型,多个消费者共同处理消息处理,速度就能大大提高了。

消息发送

这次我们循环发送,模拟大量消息堆积现象。

在publisher服务中的SpringAmqpTest类中添加一个测试方法:

/*** workQueue* 向队列中不停发送消息,模拟消息堆积。*/
@Test
public void testWorkQueue() throws InterruptedException {// 队列名称String queueName = "simple.queue";// 消息String message = "hello, message_";for (int i = 0; i < 50; i++) {// 发送消息rabbitTemplate.convertAndSend(queueName, message + i);Thread.sleep(20);}
}

消息接收

要模拟多个消费者绑定同一个队列,我们在consumer服务的SpringRabbitListener中添加2个新的方法:

@RabbitListener(queues = "simple.queue")
public void listenWorkQueue1(String msg) throws InterruptedException {System.out.println("消费者1接收到消息:【" + msg + "】" + LocalTime.now());Thread.sleep(20);
}@RabbitListener(queues = "simple.queue")
public void listenWorkQueue2(String msg) throws InterruptedException {System.err.println("消费者2........接收到消息:【" + msg + "】" + LocalTime.now());Thread.sleep(200);
}

注意到这个消费者sleep了1000秒,模拟任务耗时。

测试

启动ConsumerApplication后,在执行publisher服务中刚刚编写的发送测试方法testWorkQueue。

可以看到消费者1很快完成了自己的25条消息。消费者2却在缓慢的处理自己的25条消息。

也就是说消息是平均分配给每个消费者,并没有考虑到消费者的处理能力。这样显然是有问题的。

能者多劳

在spring中有一个简单的配置,可以解决这个问题。我们修改consumer服务的application.yml文件,添加配置:

spring:rabbitmq:listener:simple:prefetch: 1 # 每次只能获取一条消息,处理完成才能获取下一个消息

总结

Work模型的使用:

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

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

SpringAMQP--WorkQueue模型相关推荐

  1. SpringCloud源码探析(六)-消息队列RabbitMQ

    1.概述 RabbitMQ是一个开源的消息代理和队列服务器,它是基于Erlang语言开发,并且是基于AMQP协议的.由于Erlang语言最初使用与交换机领域架构,因此使得RabbitMQ在Broker ...

  2. SpringAMQP整合RabbitMQ使用---不同队列模型的具体使用

    SpringAMQP是基于RabbitMQ封装的一套模板,并且还利用SpringBoot对其实现了自动装配,使用起来非常方便. SpringAmqp的官方地址:https://spring.io/pr ...

  3. SpringAMQP的队列模型与使用

    SpringAMQP是基于RabbitMQ封装的一套模板,并且还利用SpringBoot对其实现了自动装配,使用起来非常方便. SpringAmqp的官方地址:Spring AMQP SpringAM ...

  4. RabbitMQ第二种模型--workqueue

    Work queues,也被称为(Task queues),任务模型.奉行的是平均主义 让多个消费者绑定到一个队列,共同消费队列中的消息. 队列中的消息一旦消费,就会消失,因此任务是不会被重复执行的. ...

  5. 【微服务】SpringAMQP

    SpringAMQP是基于RabbitMQ封装的一套模板,并且还利用SpringBoot对其实现了自动装配,使用起来非常方便. SpringAmqp的官方地址:https://spring.io/pr ...

  6. day72 JavaWeb框架阶段——RabbitMQ消息队列【了解常见的MQ产品,了解RabbitMQ的5种消息模型,会使用Spring AMQP】

    文章目录 0.学习目标 1.RabbitMQ 1.1.搜索与商品服务的问题 1.2.消息队列(MQ) 1.2.1.什么是消息队列 1.2.2.AMQP和JMS 1.2.3.常见MQ产品 1.2.4.R ...

  7. RabbitMQ 服务异步通信 -- 入门案例(消息预存机制)、SpringAMQP、发布订阅模式(FanoutExchange、DirectExchange、TopicExchange)、消息转换器

    文章目录 1. 入门案例 2. 完成官方Demo中的hello world案例 2.1 创建1个工程,2个模块 2.1.1 父工程的依赖,子工程不需要导入额外的依赖 2.1.2 配置子工程的配置文件( ...

  8. SpringAMQP(基于RabbitMQ)知识点总结

    文章目录 前言 一.Basic Queue 简单队列模型 1.1消息发送 1.2消息接收 1.3测试 二.WorkQueue 2.1消息发送 2.2消息接收 2.3测试 2.4能者多劳 2.5总结 三 ...

  9. 微服务08_RabbitMQ的SpringAMQP基本介绍

    微服务08_RabbitMQ的SpringAMQP基本介绍 一.SpringAMQP 的基本介绍: AMQP Spring AMQP 二.SpringAMQP实现基础消息队列功能(rabbit中必须现 ...

  10. SpringAMQP整合RabbitMQ-五种工作模式Demo

    文章目录 一.MQ基本概念 二.RabbitMQ 三.Docker部署RabbitMQ 四.SpringAMQP 五.RabbitMQ工作模式 1.Basic Queue 简单模式 2.Work qu ...

最新文章

  1. 存储方式与介质对性能的影响
  2. 浏览器获取浏览历史_浏览器历史的未来
  3. java婚庆网站源码_基于jsp的婚庆网站-JavaEE实现婚庆网站 - java项目源码
  4. MySQL安装错误: unknown option '--skip-federated'
  5. 人脸识别案例:【实战】opencv人脸检测+Haar特征分类器
  6. 几种方法找到整型阵列中的最大值和最小值
  7. qml 定义函数_QML类型系统
  8. 2017-7-8 OpenStack手工+oz自动制作CentOS 7.3镜像
  9. Python学习(三)-----用户输入和while循环
  10. C语言ascii对照表
  11. 自动跑程序vbs脚本
  12. 使用大白鲨进行木马攻击实验并实现爆破目标机账号密码以远程连接
  13. 计算机与生活的ppt,计算机应用基础说课PPT
  14. 8081端口导致React Native启动失败
  15. word批量调整图片大小:
  16. 为什么你的温湿度传感器测不准?
  17. foxmail连接163邮箱服务器,win10系统下foxmail绑定或添加163邮箱的方法
  18. HDU 5296 Annoying problem LCA+树状数组
  19. html中怎么设置input的背景颜色,css里我们选中一个div里的一个input设置背景色
  20. Linux笔记——软件包管理

热门文章

  1. 一步步学习操作系统(1)——参照ucos,在STM32上实现一个简单的多任务(“啰里啰嗦版”)...
  2. Django内建模版标签和过滤器
  3. noip模拟赛 abcd
  4. Android 文件的存储和加载
  5. 为什么EXE不能超过4GB
  6. C#中string类型赋值问题
  7. Python Web框架学习【Flask】
  8. 浅谈HTTP响应拆分攻击(一)
  9. nltk book的下载
  10. DDOS***类型以及iptables防范ddos脚本