【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.1
    port: 5672
    username: guest
    password: guest
  1. publisher模块中编写单元测试,测试消息发送
@SpringBootTest
@Slf4j
class PublisherApplicationTest {
    @Resource
    private RabbitTemplate rabbitTemplate;

    @Test
    public 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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ControlNet作者新作Omost 一句话将LLM的编码能力转化为图像生成能力,秒变构图小作文,再也不用为不会写提示词担心了!

近日&#xff0c;ControlNet的作者推出了一个全新的项目—Omost。Omost是一个将LLM的编码能力转化为图像生成能力的项目。对现有图像模型的提示词理解有着巨大的帮助。通过很短的提示词&#xff0c;就可以生成非常详细并且空间表现很准确的图片。 完美解决新手小白不会写提示词…

数据结构01 栈及其相关问题讲解

栈是一种线性数据结构&#xff0c;栈的特征是数据的插入和删除只能通过一端来实现&#xff0c;这一端称为“栈顶”&#xff0c;相应的另一端称为“栈底”。 栈及其特点 用一个简单的例子来说&#xff0c;栈就像一个放乒乓球的圆筒&#xff0c;底部是封住的&#xff0c;如果你想…

QField测量功能

QField提供开箱即用的测量功能&#xff0c;可以灵活更改工程中测量距离和面积的单位。您可以在 "常规" 部分导航到 "工程" 菜单&#xff0c;并选择 "工程属性..." 完成此操作。 要启用测量工具&#xff0c;请打开主菜单并选择 测量工具 。 启…

JS 描述二叉树(含二叉树的前、中、后序遍历)

JS 对象描述二叉树 const binaryTreeNode {value: A,left: {value: B,left: {value: C,right: {value: G}},right: {value: D}},right: {value: E,left: {value: F,left: { value: H },right: { value: L }}} }前、中、后序遍历结果 前序遍历&#xff08;中在前&#xff09;&a…

网络的下一次迭代:AVS 将为 Web2 带去 Web3 的信任机制

撰文&#xff1a;Sumanth Neppalli&#xff0c;Polygon Ventures 编译&#xff1a;Yangz&#xff0c;Techub News 本文来源香港Web3媒体&#xff1a;Techub News AVS &#xff08;主动验证服务&#xff09;将 Web2 的规模与 Web3 的信任机制相融合&#xff0c;开启了网络的下…

vue中使用emit

1. vue中使用emit 1.1. 在子组件中触发事件 1.1.1. 子组件示例 (ChildComponent.vue) 1.2. 在父组件中监听事件 1.2.1. 父组件示例 (ParentComponent.vue) vue3中使用emit 1.3. 使用 setup 函数和 defineEmits 1.3.1. 子组件示例 (ChildComponent.vue)1.3.2. 父组件示例 (Pare…

Node.js进阶——数据库

文章目录 一、步骤1、安装操作 MySQL数据库的第三方模块(mysql)2、通过 mysql 模块连接到 MySQL 数据库3、测试 二、操作 mysql 数据库1、查询语句2、插入语句3、插入语句快捷方式4、更新数据5、更新语句快捷方式6、删除数据7、标记删除 二、前后端的身份认证1、web开发模式1&a…

AIRNet模型使用与代码分析(All-In-One Image Restoration Network)

AIRNet提出了一种较为简易的pipeline&#xff0c;以单一网络结构应对多种任务需求&#xff08;不同类型&#xff0c;不同程度&#xff09;。但在效果上看&#xff0c;ALL-In-One是不如One-By-One的&#xff0c;且本文方法的亮点是batch内选择patch进行对比学习。在与sota对比上…

尚品汇-(一)

&#xff08;1&#xff09;技术介绍 &#xff08;2&#xff09;业务介绍 &#xff08;3&#xff09;虚拟机安装 可以稍后配置镜像:选第二个 采用第二项NET模式&#xff1a; 安装完成&#xff1a;开启 不选择界面的&#xff0c;选择基础的 分配了ip&#xff1a; 测试网络 为…

Debain12 离线安装docker

官网教程&#xff1a;https://docs.docker.com/engine/install/debian/ 步骤 1. 解压 docker-deb.7z 安装包并上传Linux &#xff08;资源在PC端文章顶部&#xff09; 2. 安装 .deb 包 sudo dpkg -i ./containerd.io_<version>_<arch>.deb \./docker-ce_<vers…

贪心+构造,CF1153 C. Serval and Parenthesis Sequence

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 1153C - Codeforces 二、解题报告 1、思路分析 对于括号匹配问题我们经典做法是左括号当成1&#xff0c;右括号当成-1 那么只要任意前缀非负且最终总和为0那么该括号序列就是合法 对于本题&…

ThinkPHP+Bootstrap简约自适应网址导航网站源码

使用 ThinkPHPbootstrap 开发&#xff0c;后台采用全局 ajax 无刷新加载&#xff0c;前后台自适应&#xff0c;前台页面非常简洁适合自己收藏网站或做导航网站。 搭建教程&#xff1a; 1.整个主机 2.绑定解析域名 3.上传源码&#xff0c;解压 把解压出来的 nav.sql 文件导入数…

Linux进程间通信---使用【共享内存+信号量+消息队列】的组合来实现服务器进程与客户进程间的通信

IPC结合实现进程间通信实例 下面将使用【共享内存信号量消息队列】的组合来实现服务器进程与客户进程间的通信。 共享内存用来传递数据&#xff1b;信号量用来同步&#xff1b;消息队列用来 在客户端修改了共享内存后通知服务器读取。 server.c&#xff1a;服务端接收信息 …

解决linux jenkins要求JDK版本与项目版本JDK不一致问题

背景–问题描述&#xff1a; 新入职公司&#xff0c;交接人说jenkins运行有问题&#xff0c;现在都是手动发布&#xff0c;具体原因让我自己看&#xff08;笑哭&#xff09;。我人都蒙了&#xff0c;测试环境都手动发布&#xff0c;那不是麻烦的要死&#xff01; 接手后&am…

【后端开发】服务开发场景之高可用(冗余设计,服务限流,降级熔断,超时重试,性能测试)

【后端开发】服务开发场景之高可用&#xff08;冗余设计&#xff0c;服务限流&#xff0c;降级熔断&#xff0c;超时重试&#xff0c;性能测试&#xff09; 文章目录 序&#xff1a;如何设计一个高可用的系统&#xff1f;可用性的判断指标是什么&#xff1f;哪些情况会导致系统…

人工智能(三)AI是怎么学习的

一、引言 通过之前的人工智能架构分析和Transformer模型的原理介绍&#xff0c;读者应该对人工智能有了一个初步的了解。 但是很多读者不是很想知道那么多软件方面的专业知识&#xff0c;通过大家的问题&#xff0c;大家关心的主要是三个方面&#xff1a; ai是怎么学习的&#…

数字政府与大模型

1. 什么是数字政府&#xff1f; 数字政府是指运用信息技术&#xff0c;如互联网、大数据、云计算等&#xff0c;来改革政府的服务提供方式、决策过程和内部管理&#xff0c;以提升效率、透明度和公众参与度的新型政府形态。 2. 大模型在数字政府中的作用是什么&#xff1f; …

htb_Blurry

端口扫描 8 按照教程注册安装clear ml 加载configuration的时候会报错 将json里的API&#xff0c;File Store的host都添加到/etc/hosts中 即可成功初始化 查找clear ml漏洞 发现一个cve-2024-24590 下面是一个利用脚本&#xff0c;但不能直接用 ClearML-vulnerability-e…

partially initialized module ‘charset_normalizer‘ has no attribute ‘md__mypyc‘

django项目运行报错&#xff1a; partially initialized module ‘charset_normalizer‘ has no attribute ‘md__mypyc‘…… 解决办法 pip install --force-reinstall charset-normalizer3.1.0

OpenCV 的模板匹配

OpenCV中的模板匹配 模板匹配&#xff08;Template Matching&#xff09;是计算机视觉中的一种技术&#xff0c;用于在大图像中找到与小图像&#xff08;模板&#xff09;相匹配的部分。OpenCV提供了多种模板匹配的方法&#xff0c;主要包括基于相关性和基于平方差的匹配方法。…