微服务:Rabbitmq的WorkQueue模型的使用、默认消费方式(消息队列中间件)

文章目录

    • WorkQueue模型
      • 控制预取消息个数

WorkQueue模型

当然,一个队列,可以由多个消费者去监听。

来实现一下.

生产者:

    @Testpublic 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(30); // 每次}}

消费者(这里我们弄两个):

@Component
public class SpringRabbitListener {@RabbitListener(queues = "simple.queue")public void listenSimpleQueueMessage1(String msg) throws InterruptedException {System.out.println("消费者1接收到消息:" + msg);}@RabbitListener(queues = "simple.queue")public void listenSimpleQueueMessage2(String msg) throws InterruptedException {System.out.println("消费者2接收到消息:" + msg);}
}

启动看一下结果:

先启动消费者,再发送大量消息:

在这里插入图片描述

这里是因为mq有预分配,一人一半,消费能力一样,所以看起来像是轮流一人执行了一次一样,其实不是,后面会说到。

先发送大量消息,再启动消费者:

在这里插入图片描述

这里是因为消费者1先启动了,2还没启动呢,就被1消费完了。

所以我们改造一下测试代码,让消费者消费能力不同,同时让消费者先都启动,然后再送大量消息:

    @RabbitListener(queues = "simple.queue")public void listenSimpleQueueMessage1(String msg) throws InterruptedException {System.out.println("消费者1接收到消息:" + msg);Thread.sleep(20);}@RabbitListener(queues = "simple.queue")public void listenSimpleQueueMessage2(String msg) throws InterruptedException {System.out.println("消费者2接收到消息:" + msg);Thread.sleep(200);}
消费者2接收到消息:hello, message-0
消费者1接收到消息:hello, message-1
消费者1接收到消息:hello, message-3
消费者1接收到消息:hello, message-5
消费者2接收到消息:hello, message-2
消费者1接收到消息:hello, message-7
消费者1接收到消息:hello, message-9
消费者1接收到消息:hello, message-11
消费者2接收到消息:hello, message-4
消费者1接收到消息:hello, message-13
消费者1接收到消息:hello, message-15
消费者1接收到消息:hello, message-17
消费者1接收到消息:hello, message-19
消费者2接收到消息:hello, message-6
消费者1接收到消息:hello, message-21
消费者1接收到消息:hello, message-23
消费者1接收到消息:hello, message-25
消费者2接收到消息:hello, message-8
消费者1接收到消息:hello, message-27
消费者1接收到消息:hello, message-29
消费者1接收到消息:hello, message-31
消费者2接收到消息:hello, message-10
消费者1接收到消息:hello, message-33
消费者1接收到消息:hello, message-35
消费者1接收到消息:hello, message-37
消费者2接收到消息:hello, message-12
消费者1接收到消息:hello, message-39
消费者1接收到消息:hello, message-41
消费者1接收到消息:hello, message-43
消费者2接收到消息:hello, message-14
消费者1接收到消息:hello, message-45
消费者1接收到消息:hello, message-47
消费者1接收到消息:hello, message-49
消费者2接收到消息:hello, message-16
消费者2接收到消息:hello, message-18
消费者2接收到消息:hello, message-20
消费者2接收到消息:hello, message-22
消费者2接收到消息:hello, message-24
消费者2接收到消息:hello, message-26
消费者2接收到消息:hello, message-28
消费者2接收到消息:hello, message-30
消费者2接收到消息:hello, message-32
消费者2接收到消息:hello, message-34
消费者2接收到消息:hello, message-36
消费者2接收到消息:hello, message-38
消费者2接收到消息:hello, message-40
消费者2接收到消息:hello, message-42
消费者2接收到消息:hello, message-44
消费者2接收到消息:hello, message-46
消费者2接收到消息:hello, message-48

可以看到,其实rabbitmq默认有预分配(预取,每个消费者和队列中有一个通道,存放预取的消息),平均分消息,然后各自独立消费,所以消费者2要比消费者1消费完25条(50/2)消息时间长。

显然是不合理的,我们可以改造一下:

控制预取消息个数

配置中prefetch设置为1,每次消费完消息才取下一个。(能力越大,责任越大,消费快的,消费越多)

spring:rabbitmq:host: ip # 主机名port: 5672 # 端口virtual-host: / # 虚拟主机username: guest # 用户名password: guest # 密码listener:simple:prefetch: 1

重新试一下:

消费者2接收到消息:hello, message-0
消费者1接收到消息:hello, message-1
消费者1接收到消息:hello, message-2
消费者1接收到消息:hello, message-3
消费者1接收到消息:hello, message-4
消费者2接收到消息:hello, message-5
消费者1接收到消息:hello, message-6
消费者1接收到消息:hello, message-7
消费者1接收到消息:hello, message-8
消费者1接收到消息:hello, message-9
消费者2接收到消息:hello, message-10
消费者1接收到消息:hello, message-11
消费者1接收到消息:hello, message-12
消费者1接收到消息:hello, message-13
消费者1接收到消息:hello, message-14
消费者2接收到消息:hello, message-15
消费者1接收到消息:hello, message-16
消费者1接收到消息:hello, message-17
消费者1接收到消息:hello, message-18
消费者2接收到消息:hello, message-19
消费者1接收到消息:hello, message-20
消费者1接收到消息:hello, message-21
消费者1接收到消息:hello, message-22
消费者1接收到消息:hello, message-23
消费者2接收到消息:hello, message-24
消费者1接收到消息:hello, message-25
消费者1接收到消息:hello, message-26
消费者1接收到消息:hello, message-27
消费者1接收到消息:hello, message-28
消费者2接收到消息:hello, message-29
消费者1接收到消息:hello, message-30
消费者1接收到消息:hello, message-31
消费者1接收到消息:hello, message-32
消费者1接收到消息:hello, message-33
消费者2接收到消息:hello, message-34
消费者1接收到消息:hello, message-35
消费者1接收到消息:hello, message-36
消费者1接收到消息:hello, message-37
消费者1接收到消息:hello, message-38
消费者2接收到消息:hello, message-39
消费者1接收到消息:hello, message-40
消费者1接收到消息:hello, message-41
消费者1接收到消息:hello, message-42
消费者1接收到消息:hello, message-43
消费者2接收到消息:hello, message-44
消费者1接收到消息:hello, message-45
消费者1接收到消息:hello, message-46
消费者1接收到消息:hello, message-47
消费者1接收到消息:hello, message-48
消费者2接收到消息:hello, message-49

这样,消费能力大的(消费者1),消费的越多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/21471.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NoSQL实战(MongoDB搭建主从复制)

什么是复制集&#xff1f; MongoDB复制是将数据同步到多个服务器的过程&#xff1b; 复制集提供了数据的冗余备份并提高了数据的可用性&#xff0c;通常可以保证数据的安全性&#xff1b; 复制集还允许您从硬件故障和服务中断中恢复数据。 保障数据的安全性 数据高可用性 (2…

Leecode---技巧---只出现一次的数字 / 多数元素

题解&#xff1a; 利用异或运算 a⊕a 0 的性质&#xff0c;可用来消除所有出现了两次的元素&#xff0c;最后剩余的即为所得。 class Solution { public:int singleNumber(vector<int>& nums){// 初始化为0int ans 0;for(int x: nums){// 异或操作ans ^ x;}retur…

1、 认识信号完整性、信号完整性设计、信号完整性仿真

1. 什么是信号完整性&#xff1f; 狭义上讲&#xff0c;就是信号由源经过传输到达宿时没有发生任何变化。实际中&#xff0c;上述的情况是不存在了&#xff0c;任何信号经过传输以后不可能完全不变&#xff0c;幅度、相位或频率的不变总有一款是系统不能给与的&#xff01;&a…

关于Openstack删除卷出错的有效解决方案

关于Openstack删除卷时显示卷出错的解决方案 今天删除卷的时候突然发现 删除卷出错 但是还好解决方式还算简单 下面将简洁的写下我的解决方案 当在 Web界面 删除卷时 可能会出现上面的错误 这是因为服务器&#xff0c;出现BUG&#xff0c;卷被附加给了NONE&#xff0c;并且无…

HarmonyOS NEXT星河版之自定义List下拉刷新与加载更多

文章目录 一、加载更多二、下拉刷新三、小结 一、加载更多 借助List的onReachEnd方法&#xff0c;实现加载更多功能&#xff0c;效果如下&#xff1a; Component export struct HPList {// 数据源Prop dataSource: object[] []// 加载更多是否ingState isLoadingMore: bool…

PostgreSQL的视图pg_stat_activity

PostgreSQL的视图pg_stat_activity pg_stat_activity 是 PostgreSQL 系统视图&#xff0c;用于显示当前正在进行的数据库会话&#xff08;连接&#xff09;的活动信息。通过查询这个视图&#xff0c;数据库管理员可以监控当前数据库的状态&#xff0c;识别性能瓶颈&#xff0c…

ant X6高亮

先附上效果图 // 节点内属性的点击事件&#xff1a;node:port:click graph.on(‘node:port:click’, ({ node, port }) > { resetAllHighlights(); highlightPort(node, port, true); highlightEdgesForPort(port, new Set()); }); // 以下为源码 <template><div…

Java I/O 与 NIO:深入文件和网络编程

Java I/O 与 NIO&#xff1a;深入文件和网络编程 引言 在现代应用程序中&#xff0c;I/O操作&#xff08;输入/输出&#xff09;是必不可少的部分&#xff0c;无论是文件读写还是网络通信。在本篇文章中&#xff0c;我们将深入探讨Java的I/O系统&#xff0c;包括传统的I/O&am…

Python GNN图神经网络代码实战;GAT代码模版,简单套用,易于修改和提升,图注意力机制代码实战

1.GAT简介 GAT&#xff08;Graph Attention Network&#xff09;模型是一种用于图数据的深度学习模型&#xff0c;由Veličković等人在2018年提出。它通过自适应地在图中计算节点之间的注意力来学习节点之间的关系&#xff0c;并在节点表示中捕捉全局和局部信息。 GAT模型的核…

AI文章互评:得分最高的竟然不是GPT-4!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

Rspack + vue 修改css代码不能热更新

环境 rspack/cli0.6.5rspack/core0.6.5vue3.4.27 原因 使用了 rspack.config 中的 experiments.css:true&#xff08;默认&#xff09; export defualt {//...module: {rules:[{test: /\.css/,type: css},{test: /\.less/,use:[less-loader],type: css},]},//... } 自带的…

Dubbo的路由策略剖析

1 概述 Dubbo中的路由策略的作用是服务消费端使用路由策略对服务提供者列表进行过滤和选择&#xff0c;最终获取符合路由规则的服务提供者。 Dubbo中的路由策略主要分为两类&#xff0c;StateRouter和普通Router。 StateRouter &#xff08;如TagStateRouter、ConditionStat…

实力!云起无垠晋级“第九届安全创客汇”年度10强

2024年5月28日&#xff0c;第九届“安全创客汇”复赛在重庆圆满落幕。在本次国内最具影响力的网络安全创业大赛中&#xff0c;云起无垠凭借其技术的创新性和巨大市场价值&#xff0c;成功跻身年度十强。 随着人工智能技术的不断发展&#xff0c;特别是在大模型技术的推动下&…

【图像处理与机器视觉】XJTU期末考点

题型 选择&#xff1a;1 分10 填空&#xff1a;1 分15 简答题&#xff08;也含有计算和画图&#xff09;&#xff1a;10 分*4 计算题&#xff1a;15 分20 分 考点 选择题&#xff08;部分&#xff09; 数字图像处理基础 p(x,y),q(s,t)两个像素之间的距离由公式&#xff1a…

湖南(品牌调研)源点咨询 企业品牌调研侧重点分析

本文由湖南长沙&#xff08;市场调研&#xff09;源点咨询编辑发布 企业建立品牌&#xff0c;往往都需进行科学性的品牌调研。因为只有这样&#xff0c;才能让企业更好的把握市场的发展趋势&#xff0c;进而为品牌的建立和发展提供更有价值的数据参考&#xff01;那么品牌的调…

江淮集团分享:江淮集团数据管理实践

下文为江淮集团信息化管理部副部长丁志海的演讲全文&#xff1a; 大家下午好。我是来自江淮汽车的丁志海&#xff0c;我做IT、做信息化做这一块有二十多年了。这次得帆邀请我来讲讲数据管理的实践经验。我就想说一说我的感受&#xff0c;为什么我们当初选择得帆&#xff0c;和一…

微信小程序计算器

微信小程序计算器 index.wxml <view classscreen>{{result}}</view><view classtest-bg><view classbtnGroup><view classitem grey bindtapclickButton id"{{C}}">AC</view><view classitem grey bindtapclickButton id&q…

AI精选付费资料包【37GB】

课程介绍 一、人工智能论文合集 二、AI必读经典书籍 三、超详细人工智能学习大纲 四、机器学习基础算法教程 五、深度学习神经网络基础教程 六、计算机视觉实战项目 课程获取 资料&#xff1a;AI精选付费资料包&#xff08;37.4GB&#xff09;获取&#xff1a;扫码关注公z号…

esp8266阿里云上线(小程序控制)

此wechatproject已上传在页面最上方 由图可见&#xff0c;项目只有两个页面&#xff0c;一个是获取该产品下的设备信息列表&#xff0c;一个是某设备对应的详情控制页面&#xff0c;由于这个项目只利用esp8266板子上自带的led&#xff0c;功能简单&#xff0c;只需要控制开关即…

leetcode 575.分糖果

思路&#xff1a;开两个数组&#xff0c;一个用来存储非负数的糖果个数&#xff0c;一个用来存储负数的糖果个数&#xff0c;这两个数组都是状态数组&#xff0c;而不是计数数组 如果当前能够吃的种类大于现有的种类&#xff0c;现有的种类个数就是答案&#xff1b; 如果当前…