RabbitMQ基础篇之Java客户端 Work Queues

文章目录

    • 模型概述
    • 需求
    • 实现步骤
      • 创建队列
      • 定义消费者
      • 定义消息发送
      • 测试执行
      • 观察结论
      • 多消费者的作用
      • 性能差异
      • 生产环境中的应用
      • 处理速度差异的情况
      • 优化示例
      • 总结

模型概述

  • Work Queues 模型也称为任务模型,多个消费者绑定到同一个队列,共同消费队列中的消息。
  • 特点
    • 每条消息只会被一个消费者处理,消息不会被多个消费者同时消费。
    • 消息的处理是分配给绑定到队列的消费者,多个消费者可以加速消息的处理。



需求

模拟 WorkQueue,实现一个队列绑定多个消费者

  • 在 RabbitMQ 的控制台创建一个队列,名为 work.queue
  • 在 publisher 服务中定义测试方法,发送 50 条消息到 work.queue
  • 在 consumer 服务中定义两个消息监听者,都监听 work.queue 队列


实现步骤

创建队列

  • 在控制台创建队列,命名为 work_queue




定义消费者

  • Consumer 服务中定义两个消息监听者(即消费者)。
  • 监听的队列改为 work_queue,分别打印消息处理情况,并加上时间戳。
  • 为区分不同消费者,使用不同的打印样式(例如,Consumer 1 用黑色,Consumer 2 用红色打印)。
@RabbitListener(queues = "work.queue")
public void listenWorkQueue1(String message) {System.out.println("消费者11111111111111111接收到的消息: " +message +", " +LocalTime.now());
}@RabbitListener(queues = "work.queue")
public void listenWorkQueue2(String message) {System.err.println("消费者22222222222222222接收到的消息: " +message +", " +LocalTime.now());
}



定义消息发送

  • 在发送者服务中,编写发送 50 条消息的代码。
  • 使用循环发送消息,并在消息中附加编号,以便消费者知道自己接收的是第几条消息。
@Test
public void testWorkQueue() {// 队列名称String queueName = "work.queue";for (int i = 1; i <= 50; i++) {// 消息String message = "Hello, Spring AMQP_" + i;// 发送消息rabbitTemplate.convertAndSend(queueName, message);}
}



测试执行

  • 启动消费者后,开始发送 50 条消息。
  • 观察消费者的消息接收情况:
    • Consumer 1 接收到偶数编号的消息,Consumer 2 接收到奇数编号的消息。
    • 每个消费者分别接收 25 条消息,分配是均匀的(轮询机制)。




观察结论

  • 结论 1: 同一个消息只会被一个消费者处理,不会被多个消费者处理。
  • 结论 2: 消息的分配是均匀的,即使有多个消费者,每个消费者会轮流处理消息。例如,消息1分给消费者2,消息2分给消费者1,依此类推。


多消费者的作用

  • 增加消费者数目可以提高消息的处理速度。
  • 如果只有一个消费者,则所有消息由一个消费者处理。如果有多个消费者,消息会被分配给不同的消费者,提高处理效率。



性能差异

  • 情况 1: 一个消费者处理所有消息时,消息处理的速度较慢。
  • 情况 2: 多个消费者处理消息时,可以大大提高消息的处理速度。
    • 例如,2 个消费者分别处理 25 条消息,处理速度快。
    • 3 个消费者则每人处理约 16 条,4 个消费者则每人处理约 12 条消息。


生产环境中的应用

  • 在实际生产中,通常不会手动创建多个消费者方法。一般是写一个消费者方法,并通过部署多个实例(多台机器或多个服务实例)来实现多个消费者。
  • 这样可以使用不同机器的资源来处理消息,进一步提升消息处理速度。


处理速度差异的情况

  • 如果不同消费者的处理速度不同,默认的轮询分配可能不够合理。为了解决这个问题,可以使用 prefetch 配置来优化消息的分配。
    • 默认情况下,RabbitMQ 使用轮询方式来分配消息。
    • 如果某个消费者处理消息较慢,默认的分配方式会导致它处理大量消息,处理速度慢。
    • 可以通过配置 spring.rabbitmq.listener.simple.prefetch=1 来优化。这样每个消费者只能提前获取一条消息,直到当前消息处理完毕,才能获取下一条。
spring:rabbitmq:listener:simple:prefetch: 1 # 每次只能获取一条消息,处理完成才能获取下一个消息  



优化示例

  • 在消费者 1 中设置每条消息处理后休眠 25 毫秒,每秒处理 40 条消息。
  • 在消费者 2 中设置每条消息处理后休眠 200 毫秒,每秒处理 5 条消息。
  • 通过这种方式模拟消费者处理速度不同。
@RabbitListener(queues = "work.queue")
public void listenWorkQueue1(String message) throws InterruptedException {System.out.println("消费者11111111111111111接收到的消息: " + message + ", " + LocalTime.now());Thread.sleep(25);
}@RabbitListener(queues = "work.queue")
public void listenWorkQueue2(String message) throws InterruptedException {System.err.println("消费者22222222222222222接收到的消息: " + message + ", " + LocalTime.now());Thread.sleep(200);
}




总结

  • Work Queues 模型通过多个消费者共同消费同一队列的消息,提高了处理速度,解决了单个消费者处理过慢的问题。
  • 生产环境中通过多实例部署,可以有效地扩展消费者数量,提升系统处理能力。

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

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

相关文章

vscode代码AI插件Continue 安装与使用

“Continue” 是一款强大的插件&#xff0c;它主要用于在开发过程中提供智能的代码延续功能。例如&#xff0c;当你在编写代码并且需要进行下一步操作或者完成一个代码块时&#xff0c;它能够根据代码的上下文、语法规则以及相关的库和框架知识&#xff0c;为你提供可能的代码续…

ubuntu 如何使用vrf

在Ubuntu或其他Linux系统中&#xff0c;您使用ip命令和sysctl命令配置的网络和内核参数通常是临时的&#xff0c;这意味着在系统重启后这些配置会丢失。为了将这些配置持久化&#xff0c;您需要采取一些额外的步骤。 对于ip命令配置的网络接口和路由&#xff0c;您可以将这些配…

二、SQL语言,《数据库系统概念》,原书第7版

文章目录 一、概览SQL语言1.1 SQL 语言概述1.1.1 SQL语言的提出和发展1.1.2 SQL 语言的功能概述 1.2 利用SQL语言建立数据库1.2.1 示例1.2.2 SQL-DDL1.2.2.1 CREATE DATABASE1.2.2.2 CREATE TABLE 1.2.3 SQL-DML1.2.3.1 INSERT INTO 1.3 用SQL 语言进行简单查询1.3.1 单表查询 …

【ArcGIS Pro/GeoScene Pro】可视化时态数据

可视化过去二十年新西兰国际旅游业的发展变化 工程数据下载 ArcGIS Pro 快速入门指南—ArcGIS Pro | 文档 添加数据 数据为中国旅客数据 转置表字段 列数据转行数据

git在idea中操作频繁出现让输入token或用户密码,可以使用凭证助手(使用git命令时输入的用户密码即可) use credential helper

1、打开 idea 设置&#xff0c;找到 git 路径 File | Settings | Version Control | Git 2、勾选 Use credential helper 即可

CPT203 Software Engineering 软件工程 Pt.5 软件测试(中英双语)

文章目录 8. 软件测试8.1 Testing&#xff08;测试&#xff09;8.1.1 A note of testing under the V & A framework8.1.2 The Basics8.1.3 The Goals8.1.4 The Stages 8.2 Developing testing&#xff08;开发测试&#xff09;8.2.1 Unit testing&#xff08;单元测试&…

Docker基础知识 Docker命令、镜像、容器、数据卷、自定义镜像、使用Docker部署Java应用、部署前端代码、DockerCompose一键部署

目录 1.Docker 2.镜像和容器 2.1 定义 2.2 开机自动启动容器 3.docker命令 3.1 docker run 参数说明 3.2 常见命令 3.3 命令演示 3.4 命令别名 4.Docker命令详解 5.数据卷 5.1 定义 5.2 数据卷的相关命令 5.3 数据卷命令 5.4 挂载本地目录或文件 5.4.1 定义 5.4.2 mysql容器目录…

探索CSDN博客数据:使用Python爬虫技术

探索CSDN博客数据&#xff1a;使用Python爬虫技术 在数字化的浪潮中&#xff0c;数据的获取与分析变得日益关键。CSDN作为中国领先的IT社区和服务平台&#xff0c;汇聚了海量的技术博客与文章&#xff0c;成为一座蕴藏丰富的数据宝库。本文将引领您穿梭于Python的requests和py…

Python 自动化 打开网站 填表登陆 例子

图样 简价&#xff1a; 简要说明这个程序的功能&#xff1a; 1. **基本功能**&#xff1a; - 自动打开网站 - 自动填写登录信息&#xff08;号、公司名称、密码&#xff09; - 显示半透明状态窗口实时提示操作进度 2. **操作流程**&#xff1a; - 打开网站后自动…

2025常见的软件测试面试题

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 “ 今天我给大家介绍一些python自动化测试中常见的面试题&#xff0c;涵盖了Python基础、测试框架、测试工具、测试方法等方面的内容&#xff0c;希望能够帮助…

机器学习笔记——正则化

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本笔记介绍机器学习中常见的正则化方法。 文章目录 正则化L1 正则化&#xff08;Lasso&#xff09;原理使用场景优缺点 L2 正则化&#xff08;Ridge&#xff09;原理…

详解MySQL在Windows上的安装

目录 查看电脑上是否安装了MySQL 下载安装MySQL 打开MySQL官网&#xff0c;找到DOWNLOADS 然后往下翻&#xff0c;找到MySQL Community(GPL) Downloads>> 然后找到MySQL Community Server 然后下载&#xff0c;选择No thanks,just start my download. 然后双击进行…

电脑缺失libcurl.dll怎么解决?详解电脑libcurl.dll文件丢失问题

一、libcurl.dll文件丢失的原因 libcurl.dll是一个用于处理URL传输的库文件&#xff0c;广泛应用于各种基于网络的应用程序。当这个文件丢失时&#xff0c;可能会导致相关应用程序无法正常运行。以下是libcurl.dll文件丢失的一些常见原因&#xff1a; 软件安装或卸载不完整&a…

matlab读取二进制文件,要指定保存的数据类型

1、 a [1,2;3,4]; fileID fopen(hao.bin, wb); % 以二进制写入模式打开文件 fwrite(fileID, a, uint16); % 假设a中的数据可以表示为无符号32位整数 fclose(fileID); fileID fopen(hao.bin, rb); % 以二进制读取模式打开文件k fread(fileID)&#xff1b; 自动识别16位还…

【Java 数据结构】移除链表元素

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 1. 题目 2. 解析 3. 代码实现 4. 小结 题目出处&#xff1a;203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 1. 题目 给你一个链表的头节点 …

CannotRetrieveUpdates alert in disconnected OCP 4 cluster解决

环境&#xff1a; Red Hat OpenShift Container Platform (RHOCP) 4 问题&#xff1a; Cluster Version Operator 不断发送警报&#xff0c;表示在受限网络/断开连接的 OCP 4 集群中无法接收更新。 在隔离的 OpenShift 4 集群中看到 CannotRetrieveUpdates 警报&#xff1a; …

jvm排查问题-实践追踪问题 与思路--堆内堆外内存泄漏排查方针

概述 排查问题的一般思路是:现象 ——> 直接原因 ——>根本原因。 从问题现象出发,可以分为 应用逻辑问题、资源使用问题、虚拟机异常: 应用逻辑可能导致报错增加、死锁、程序退出等;资源问题主要集中在CPU上升和内存上升(OOM Kill);虚拟机问题通常包括GC问题、进…

uniapp:微信小程序文本长按无法出现复制菜单

一、问题描述 在集成腾讯TUI后&#xff0c;为了能让聊天文本可以复制&#xff0c;对消息组件的样式进行修改&#xff0c;主要是移除下面的user-select属性限制&#xff1a; user-select: none;-webkit-user-select: none;-khtml-user-select: none;-moz-user-select: none;-ms…

深入浅出:从入门到精通大模型Prompt、SFT、RAG、Infer、Deploy、Agent

阅读原文 渐入佳境 我们都知道&#xff0c;通过编写一个提示词&#xff08;prompt&#xff09;&#xff0c;我们可以引导大模型生成回答&#xff0c;从而开启愉快的人工智能对话&#xff0c;比如让模型介绍一下卡皮巴拉。上边简图描述了这个过程&#xff0c;我们拆成两部分 pr…

机器学习作业 | 泰坦尼克号生存的预测任务

泰坦尼克号生存的预测任务 学校作业&#xff0c;我来水一水 环境&#xff1a;pycharmanaconda虚拟环境 文章目录 泰坦尼克号生存的预测任务0.环境搭建参考&#xff1a;1 目的与要求2 任务背景3 任务简介4 模型介绍1.决策树&#xff08;Decision Tree&#xff09;2.朴素贝叶斯…