【SpringCloud学习笔记】RabbitMQ(上)

1. RabbitMQ简介

官网地址:https://www.rabbitmq.com/

2. 安装方式

安装前置准备:
此处基于Linux平台 + Docker进行安装,前置准备如下:

  • Linux云服务器 / 虚拟机
  • Docker环境

安装命令:

docker run \-e RABBITMQ_DEFAULT_USER=ricejson \-e RABBITMQ_DEFAULT_PASS=123321 \-v mq-plugins:/plugins \--name mq \--hostname mq \-p 15672:15672 \-p 5672:5672 \-d \rabbitmq:3.12.10-management-alpine

我们观察一下安装命令可以发现,配置了两个端口映射:

  • 15672:该端口是RabbitMQ的控制台端口,用户可以在浏览器地址栏进行登录
  • 5672:该端口用户不可见,供RabbitMQ内部数据传输使用

如果在地址栏中输入http://{ip}:15672能够观察到如下界面,证明安装成功!
image.png

2.1 配置参考文档

需要验证:https://blog.csdn.net/dzqxwzoe/article/details/138517406

3. 快速入门

3.1 RabbitMQ架构图


上述就是RabbitMQ的架构图,其中涉及到几个重要角色:

  • publisher:生产者,即发送消息的一方
  • consumer:消费者,即接收消息进行业务处理的一方
  • queue:队列,用于暂存生产者投递的消息,等待消费者处理
  • exchange:交换机,负责将生产者投递的消息路由给具有binding关系的queue

3.2 收发消息

Step1:配置queue:

  1. 在RabbitMQ的控制台中选择Queues
  2. 配置两个队列,名称例如hello.queue1hello.queue2
  3. 点击Add queue添加该队列

image.png
Step2:配置exchange:

  1. 在RabbitMQ控制台中选择Exchanges
  2. 配置交换机信息,例如名称:hello.exchange,类型为fanout
  3. 点击Add exchange添加交换机

image.png
Step3:配置binding关系:
就像在架构图中所示,我们的exchange会根据一定规则将生产者生产的消息路由给特定的queue,因此此处我们需要配置对应的绑定关系:

  1. 在exchange显示台中选择新添加的hello.exchange
  2. 进入其中,选择binding项,配置两个binding规则,分别将hello.queue1与hello.queue2绑定到hello.exchange上

image.png
Step4:publish投递消息:

  1. 在配置的exchange中选择publish message列表
  2. 配置message的payload载荷字段
  3. 点击Publish message发送消息

image.png
Step5:验证结果:

  1. 选择Queues,选择其中一个queue例如hello.queue1进入其中
  2. 查看Get Message选项,查看接收到的消息

image.png
image.png
此时我们就完成了基于RabbitMQ提供的控制台来完成收发消息的操作!

3.3 SpringAMQP

我们已经实现了基于控制台的方式完成消息的收发,但是我们实际开发中仍然选用编程的方式来实现消息的收发,因此接下来就要学习如何使用RabbitMQ系列的客户端完成Java代码的编写。事实上,RabbitMQ针对不同的语言提供了不同的客户端可供使用,而针对Java语言提供的客户端编码较为复杂,因此此处使用Spring整合后的 **SpringAMQP **客户端进行Java编程!

  1. 在maven配置文件中引入SpringAMQP依赖
<!--AMQP依赖,包含RabbitMQ-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
  1. application.yml配置RabbitMQ连接地址(publisher以及consumer均需要配置)
# 配置RabbitMQ地址
spring:rabbitmq:host: 127.0.0.1port: 5672username: guestpassword: guest
  1. publisher模块中编写单元测试,测试消息发送
@SpringBootTest
@Slf4j
class PublisherApplicationTest {@Resourceprivate RabbitTemplate rabbitTemplate;@Testpublic void testPublish() {// 1. 定义发送队列名String queueName = "hello.queue1";// 2. 定义消息内容String msg = "hello, SpringAMQP";// 3. 发送消息rabbitTemplate.convertAndSend(queueName, msg);}
}
  1. consumer模块中编写组件类,使用@RabbitListener注解接收消息
@Component
@Slf4j
public class RabbitMQListener {@RabbitListener(queues = "hello.queue1")public void listen(String msg) {log.info("从【hello.queue1】接收到消息:" + msg);}
}

启动项目后,观察日志文件,发现消费者确实监听到了Queuehello.queue1中的消息:
image.png

4. WorkQueues模型

**WorkQueues模型:**即任务模型,简单来说就是让多个消费者监听同一个队列中的消息,共同消费队列中的消息,该模型可用于防止消息堆积,在消息处理速度慢以及消息量大的情况非常适用,下面我们就来模拟这种场景:
需求:

  1. 创建一个新的队列work.queue
  2. 创建两个消费者监听同一个队列work.queue
  3. 创建一个生产者,生产50条消息,观察结果

步骤:

  1. 在RabbitMQ控制台中创建一个新的Queue:work.queue

image.png

  1. 在RabbitMQListener类中创建两个方法用于模拟两个消费者监听同一个队列
@RabbitListener(queues = "work.queue")
public void listenWorkQueue1(String msg) {log.info("listener1 从【work.queue】接收到消息:" + msg);
}@RabbitListener(queues = "work.queue")
public void listenWorkQueue2(String msg) {log.info("listener2 从【work.queue】接收到消息:" + msg);
}
  1. 在PublisherApplicationTest类中创建一个测试方法,模拟一个生产者生产50条消息
@Test
public void testWorkQueue() {// 1. 定义发送队列名String queueName = "work.queue";for (int i = 1; i <= 50; i++) {// 2. 定义消息内容String msg = "消息" + i;// 3. 发送消息rabbitTemplate.convertAndSend(queueName, msg);}
}

观察消费者结果如下:
image.png
可以发现默认的工作模式是采用类似于轮询方式的,那么这种方式在两个消费者消费速率相当的场景下没有问题,但是以后如果多个消费者部署在不同的机器上,多个机器性能不同造成,效率最低的及其拖慢了整个消费进程,下面就来模拟该情况:

@RabbitListener(queues = "work.queue")
public void listenWorkQueue1(String msg) throws InterruptedException {log.info("listener1 从【work.queue】接收到消息:" + msg);Thread.sleep(40);
}@RabbitListener(queues = "work.queue")
public void listenWorkQueue2(String msg) throws InterruptedException {log.info("listener2 从【work.queue】接收到消息:" + msg);Thread.sleep(200);
}

此时发现消费者1消费速度很快,1s内就完成了,但是消费者2消费速度很慢,需要5s完成,基于默认的工作模型,消息仍旧均摊给两个消费者,拖慢了整体效率。
image.png
解决方案:

  • 在消费者配置文件中引入如下配置:
spring:rabbitmq:listener:simple:prefetch: 1

这样一来就改成了"能者多劳"的工作模式了

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

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

相关文章

大文件word生成的处理与解决策略

前言 对于简单word文档的生成导出&#xff0c;java已经有着很多技术来进行处理&#xff0c;在有着相对固定的格式样板下&#xff0c;采用word模板导出相对会是比较好的选择。但是当数据量且包含大量图片后&#xff0c;采用模板导出就显得无力了&#xff0c;模板的缺点是无法应…

visdom使用时所遇的问题及解决方法

最近在用visdom进行可视化的过程中&#xff0c;虽然可有效的避免主机拒绝访问&#xff08;该问题的解决方法&#xff0c;请参考深度学习可视化工具visdom使用-CSDN博客&#xff09;即在终端输入python -m visom.server 1.训练过程中visdom出现ValueError: too many file descr…

C#知识|基于实体类对象,返回实体集合封装介绍。

哈喽,你好啊,我是雷工! 前面通过实体类封装传递了零散的参数,打包后给数据访问方法。 但当查询结果是数据集,要把查询到的数据返回给UI时,我们也可以把返回的多条零散数据封装到实体类中。 此次练习可以使用实体容器:泛型集合List<T>,当把每条数据封装成实体对…

pytorch中,load_state_dict和torch.load的区别?

在 PyTorch 中&#xff0c;load_state_dict 和 torch.load 是两个不同的函数&#xff0c;用于不同的目的。 torch.load: 用途: 从磁盘加载一个保存的对象。这个对象可以是一个模型的整个状态字典&#xff08;包含模型参数&#xff09;、优化器状态字典、甚至是任意其他 Python …

简约不简单,建筑装饰演绎现代美学

走在城市的大街小巷&#xff0c;你是否曾被那些独特而精美的建筑装饰所吸引&#xff1f;每一栋建筑都像是艺术家的杰作&#xff0c;通过精美的装饰诉说着它的故事。 我们的建筑装饰&#xff0c;不仅注重外在的美观&#xff0c;更追求内在的品质。从古典的雕花到现代的简约线条&…

Bash脚本:删除根目录内的所有node_modules文件夹

Bash脚本&#xff1a;删除根目录内的所有node_modules文件夹 常用脚本 #!/bin/bash # find . -name "node_modules" -type d -prune -print -exec rimraf {} \;# find . -name "node_modules" -type d -prune&#xff1a;使用 find 命令查找当前目录及其…

Mac 下载并激活IDEA

1.https://3.jetbra.in 打开这个网站,点击第一个网速比较快的连接 2.在新页面顶部有一个蓝色的下载链接文字< jetbra.zip(20220801) >点击下载 3.步骤2打开的页面不要关闭后面还有用 4.在idea官网下载idea对应的版本 https://www.jetbrains.com/idea/download/other.htm…

Chromium源码阅读:Mojo实战:从浏览器JS API 到blink实现

​ 通过在前面几篇文章&#xff0c;我们粗略梳理了Mojo这套跨进程通信的设计思路和IDL细节。 实际上&#xff0c;Mojo不止是跨进程通信框架&#xff0c;而是跨语言的模块通信自动化系统。 在浏览器暴露的JS API&#xff0c;也是需要通过Mojo这个系统进行桥接&#xff0c;最终…

APP怎么上架到应用商店

以下是一般将 App 上架到应用商店的基本步骤&#xff1a; 苹果 App Store 上架步骤&#xff1a; 1. 注册苹果开发者账号。 2. 创建 App ID。 3. 准备相关资料&#xff0c;如应用图标、截图、描述等。 4. 在苹果开发者平台上填写 App 信息&#xff0c;包括名称、类别、功能…

两融账户算法交易用什么好?

我们之前讲了许多关于算法交易的内容&#xff0c;但是很多家人们都在找小编反馈&#xff0c;就是两融账户的算法交易能不能使用&#xff1f;遇到集中度的问题怎么办&#xff1f;两融T0有利息吗&#xff1f; 等等一些列问题&#xff0c;小编给大家做了一个整理归纳&#xff0c;我…

蓝牙BLE上位机工具开发理论线索梳理_2.AEP是个啥?

1.1什么是终结点&#xff1f; 终结点是通过计算机网络&#xff08;如计算机、移动设备和服务器&#xff09;连接和交换信息的设备。 物联网 (IoT) 设备&#xff08;如相机、智能恒温器和扬声器&#xff09;等其他设备也被视为终结点。 与之相反的是&#xff0c;运行网络的设备&…

使用Node.js+Express开发简单接口

Node.js 和 Express 是非常流行的组合&#xff0c;用于开发快速、高效的 web 服务器和 API。下面是一个基础教程&#xff0c;介绍如何使用 Node.js 和 Express 开发一个简单的 API。 1. 安装 Node.js 和 npm 首先&#xff0c;确保您已经安装了 Node.js 和 npm&#xff08;Nod…

乡村振兴的科技创新引领:加强农业科技研发,推广先进适用技术,提高农业生产效率,助力美丽乡村建设

目录 一、引言 二、农业科技研发的重要性 &#xff08;一&#xff09;提升农业生产效率 &#xff08;二&#xff09;促进农业产业升级 &#xff08;三&#xff09;保障粮食安全 三、加强农业科技研发的策略 &#xff08;一&#xff09;加大投入力度 &#xff08;二&…

云渲染动画:C4D如何正确渲染导出动画?

​C4D是一款功能强大的3D建模、动画和渲染软件&#xff0c;在制作动画时&#xff0c;正确的渲染和导出流程至关重要&#xff0c;以确保动画质量和流畅性。 帧率概念 动画就是一幅幅图片连贯起来&#xff0c;30帧/秒&#xff0c;就是一秒出现30张图片一般国外都是30&#xff0c…

数据预处理——调整方差、标准化、归一化(Matlab、python)

对数据的预处理&#xff1a; (a)、调整数据的方差&#xff1b; (b)、标准化&#xff1a;将数据标准化为具有零均值和单位方差&#xff1b;&#xff08;均值方差归一化(Standardization)&#xff09; (c)、最值归一化&#xff0c;也称为离差标准化&#xff0c;是对原始数据的…

UKP3D用户定制图框的思路

为用户定制图框&#xff0c;记录以下图框制作方法&#xff0c;便于用户自已修改。 1.轴测图与平面图的图框&#xff1a; 1.1.图框在安装目录下&#xff0c;例如&#xff1a;E:\Program Files (x86)\UKSoft\UKP3d9.2\config\TemplateAndBlock\CADTemplate\ 1.2.配置文件在安装…

LVS/NAT负载均衡实操

添加规则,并做持久操作 1 添加规则 [rootlvs ~]# ipvsadm -A -t 10.36.178.183:80 -s wrr [rootlvs ~]# ipvsadm -a -t 10.36.178.183:80 -r 192.168.65.201:80 -m -w 3 [rootlvs ~]# ipvsadm -a -t 10.36.178.183:80 -r 192.168.65.202:80 -m -w 1[rootlvs ~]# ipvsadm -Ln …

vmmare虚拟机没有被分配ip地址问题

打开任务管理器–>服务–>找到与VM和server相关的服务 发现NAT和DHCP服务被关闭了 尝试启动&#xff0c;报错 尝试一 虚拟网络编辑器点击还原默认设置 尝试二 可以了

浅谈学习数据结构-------顺序表的感受

1.声明&#xff1a;这篇博客只是记录自己的学习感想&#xff0c;无任何知识层面的内容呦~~ 2.顺序表是线性表的一种&#xff0c;链表也是线性表的一种&#xff0c;我应该是4月份就接触了顺序表&#xff0c;但是因为这个学习顺序的原因&#xff0c;以及这个学校老师的进度&…

Android Jetpack Compose入门教程(二)

一、列表和动画 列表和动画在应用内随处可见。在本课中&#xff0c;您将学习如何利用 Compose 轻松创建列表并添加有趣的动画效果。 1、创建消息列表 只包含一条消息的聊天略显孤单&#xff0c;因此我们将更改对话&#xff0c;使其包含多条消息。您需要创建一个可显示多条消…