实用指南:【从零开始学习RabbitMQ】

news/2025/10/19 16:50:40/文章来源:https://www.cnblogs.com/slgkaifa/p/19151051

实用指南:【从零开始学习RabbitMQ】

这个课程是基于黑马商城的业务场景讲的,不用担心要不要补上黑马商城,技术是一定的,我们本来就是学习 MQ 的使用。

初识 MQ

同步调用

因为代码的耦合度高,每次有新的需求都要大动干戈,修改原代码。这是不符合开闭原则的(对拓展开放,对修改关闭)。

简单理解就是尽量通过更新代码来拓展功能,而不是修改已有代码。

因为这些业务是同步执行,在上一个业务没完成前是不会进行执行下一个业务的,这样极大的浪费 cpu 性能,因为一直在阻塞。这里我想到了 Redis 中的 IO 多路复用就是为解决这样的问题。(面试重点)

一个业务失败导致其他业务也失败。

异步调用

异步调用方式其实就是基于消息通知的方式,一般包含三个角色:

  • 消息发送者: 投递消息的人,就是原来的调用方
  • 消息代理: 管理、暂存、转发消息,你可以把它理解成微信服务器
  • 消息接收者: 接收和处理消息的人,就是原来的服务提供方

就想外卖员、外卖柜与消费者的关系,外卖员送到了就放外卖柜里,然后就去忙别的了,消费者什么时候拿是他的事,这样就非常高效了。

这里让我想到了一句话,没有什么是加一层中间件解决不了的,如果有,那就再加一层。看来也不无道理。

异步调用优势:

  • 解除耦合,拓展性强
  • 无需等待,性能好
  • 故障隔离
  • 缓存消息,流量削峰填谷

异步调用的问题是什么?

  • 不能立即得到调用结果,时效性差
  • 不确定下游业务执行是否成功
  • 业务安全依赖于Broker(代理)的可靠性

MQ 技术选型

MQ(MessageQueue),中文是消息队列,字面来看就是存放消息的队列。也就是异步调用中的Broker。

常见消息队列的比较

MQ 入门

RabbitMQ 的整体架构以及核心概念:

  • virtual-host:虚拟主机,数据隔离
  • publisher: 消息发送者
  • consumer: 消息的消费者
  • queue: 队列,存储消息
  • exchange: 交换机,负责路由消息

对应多个 VirtualHost,起到隔离的作用。

数据隔离

由于虚拟主机之间数据是隔离的,也就是即使是超级管理员也无法操作不属于自己的 virtual-host 里的功能。

可以创建自己专属的虚拟主机,比如

可以查看各个虚拟主机里的交换机,于是 hmall 用户也有了自己的数据隔离区。

Java 客户端-SpringAMQP

快速入门

需求如下:

SpringAMQP如何收发消息?

① 引入spring-boot-starter-amqp依赖

② 配置rabbitmq服务端信息

③ 利用RabbitTemplate发送消息

④ 利用@RabbitListener注解声明要监听的队列,监听消息

编写测试类:

生产者:

@SpringBootTest
public class SpringAmqpTest {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
void TestSendMessage2Queue(){
String queueName = "simple.queue";
String msg = "hello, amqp!";
rabbitTemplate.convertAndSend(queueName, msg);
}
}

消费者:

@SpringBootTest
public class SpringAmqpTest {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
void TestSendMessage2Queue(){
String queueName = "simple.queue";
String msg = "hello, amqp!";
rabbitTemplate.convertAndSend(queueName, msg);
}
}

work 模型

  1. 在RabbitMQ的控制台创建一个队列, 名为work.queue
  2. 在publisher服务中定义测试方法,在1秒内产生50条消息,发送到work.queue
  3. 在consumer服务中定义两个消息监听者,都监听work.queue队列
  4. 消费者1每秒处理50条消息,消费者2每秒处理5条消息
@SpringBootTest
public class SpringAmqpTest {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
void TestSendMessage2Queue(){
String queueName = "simple.queue";
String msg = "hello, amqp!";
rabbitTemplate.convertAndSend(queueName, msg);
}
@Test
void testWorkQueue() throws InterruptedException {
String queueName = "work.queue";
for(int i = 0; i < 50; i++){
String msg = "hello, work, message_" + i;
rabbitTemplate.convertAndSend(queueName, msg);
Thread.sleep(20);
}
}
}
@Slf4j
@Component
public class MqListener {
@RabbitListener(queues = "simple.queue")
public void listenSimpleQueue(String msg){
System.out.println("消费者收到了simple.queue的消息:【" + msg + "】");
}
@RabbitListener(queues = "work.queue")
public void listenWorkQueue1(String msg){
System.out.println("消费者1收到了work.queue的消息:【" + msg + "】" );
}
@RabbitListener(queues = "work.queue")
public void listenWorkQueue2(String msg){
System.err.println("消费者2收到了work.queue的消息:【" + msg + "】" );
}
}
消费者消息推送限制

默认情况下,RabbitMQ会将消息依次轮询投递给绑定在队列上的每一个消费者。但这并没有考虑到消费者是否已经处理完消息,可能出现消息堆积。

因此我们需要修改application.yml,设置prefetch值为1,确保同一时刻最多投递给消费者1条消息:

Work模型的使用:

  • 多个消费者绑定到一个队列, 可以加快消息处理速度
  • 同一条消息只会被一个消费者处理
  • 通过设置prefetch来控制消费者预取的消息数量, 处理完一条再处理下一条, 实现能者多劳

Fanout 交换机

真正生产环境都会经过exchange来发送消息, 而不是直接发送到队列, 交换机的类型有以下三种:

Fanout Exchange 会将接收到的消息广播到每一个跟其绑定的queue, 所以也叫广播模式

利用SpringAMQP演示FanoutExchange的使用
  1. 在RabbitMQ控制台中, 声明队列fanout.queue1和fanout.queue2

  1. 在RabbitMQ控制台中, 声明交换机hmall.fanout, 将两个队列与其绑定
  2. 在consumer服务中,编写两个消费者方法, 分别监听fanout.queue1和fanout.queue2
  3. 在publisher中编写测试方法, 向hmall.fanout发送消息
交换机的作用是什么?

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

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

相关文章

Godot-C#处理节点关系

Godot C#处理节点关系 简介 我们知道在游戏中,任何事物都可以看做一个节点,而节点之间的关系可以帮助我们更好的管理游戏世界。Godot中,节点之间的关系可以分为两种:父子关系和兄弟关系。godot已经提供了现成的方法…

2025信息流代运营推荐:线尚网络精准投放,效果显著!

2025信息流代运营推荐:线尚网络精准投放,效果显著!随着互联网技术的飞速发展,信息流广告已成为企业营销的重要手段。然而,信息流代运营领域也面临着诸多技术挑战和数据问题。本文将深入探讨当前信息流代运营领域的…

零售行业绩效流程推行难点及 Tita 目标绩效一体化管理方案

在零售行业,市场环境瞬息万变,顾客需求日益多样化,使得绩效流程的推行充满挑战。要想在激烈竞争中脱颖而出,企业需借助高效工具实现目标绩效一体化管理,Tita 平台便是有力助手,能有效攻克常见难点。 零售行业绩效…

CTFHub 信息泄露通关笔记4:备份文件下载 bak文件 - 教程

CTFHub 信息泄露通关笔记4:备份文件下载 bak文件 - 教程2025-10-19 16:39 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important;…

软件工程-结队项目

软件工程-结队项目软件工程结队项目 项目参与成员 计科三班 3123006072 郭涛 计科三班 3123004548 袁智燊这个作业属于哪个课程 <https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024>这个作业要求在哪…

go 并发赋值安全性

go 并发赋值安全性32/64位机器读写占用空间小于或等于32/64位的变量是原子操作,超过时属于非原子操作。 安全的赋值类型基本数据类型:字节型、布尔型、整型、浮点型、字符型其他数据类型:指针、函数 不安全的赋值类…

《探索C语言中数组的奥秘(下)》 - 教程

《探索C语言中数组的奥秘(下)》 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "M…

Vue中keep-alive实现原理解析

Vue中keep-alive的实现原理 什么是keep-alive keep-alive是Vue内置的一个抽象组件,用于保留组件状态或避免重新渲染。它不会在DOM树中渲染成任何实际的标签,只是将其包裹的组件实例缓存起来。 核心实现原理 1. 基于L…

2025 年防撞钢护栏厂家推荐聊城市泰锌金属材料有限公司,桥梁,不锈钢,复合管,景观,灯光,热镀锌,河道,铝合金,绳索防撞钢护栏公司推荐

行业背景随着城市化进程加速和基础设施建设持续推进,交通安全设施市场迎来稳步增长期。据行业报告显示,2025 年全球栏杆围栏市场规模有望持续扩大,其中防撞护栏作为道路安全的核心保障设施,需求尤为旺盛。在高速公…

[转]学习指南 - PL-600:Microsoft Power Platform 解决方案架构师

[转]学习指南 - PL-600:Microsoft Power Platform 解决方案架构师exam ref MICROSOFT PL-600 - Microsoft Power Platform Solution Architect : Free Premium Exam Material | CertyIQ PL-600 Exam - Free Actual …

2025年聚氨酯制品厂家推荐排行榜,浇注型聚氨酯,聚氨酯预聚体,聚氨酯胶黏剂,聚氨酯组合料,液体聚氨酯,专业品质与创新技术之选

2025年聚氨酯制品厂家推荐排行榜,浇注型聚氨酯,聚氨酯预聚体,聚氨酯胶黏剂,聚氨酯组合料,液体聚氨酯,专业品质与创新技术之选随着工业和制造业的快速发展,聚氨酯制品在各个领域的应用越来越广泛。从浇注型聚氨酯…

Java异步编程难题拆解

在当今高并发、大数据量的应用场景下,同步编程模式常常会致使线程阻塞,对系统性能和响应速度造成严重影响。Java异步编程借助非阻塞方式执行任务,能显著提升系统的吞吐量和资源利用率。不过,异步编程牵涉复杂的线程…

三场比赛(二)

0.前言 最近三场比赛不止有三场。 1.正文 比赛 如果每场单独写再加上杂题等等的话就有点太多了,而且比赛间能看出一些共同的东西,所以就一起写了。 优点发挥较为稳定。该想出来的简单题都能想出来,该会做的原题都能…

深入学习Spring Boot框架

一、引言 Spring Boot是一个基于Spring框架的快速应用开发框架,它极大地简化了新Spring应用的初始搭建及开发过程。通过“约定优于配置”的理念,Spring Boot减少了大量样板代码和繁琐配置,让开发者能够更专注于业务…

2025年水产养殖设备厂家推荐排行榜,PP鱼池/微滤机/不锈钢微滤机/锦鲤池微滤机一体机/全自动污水过滤器/生物过滤器/循环水养殖系统公司推荐!

2025年水产养殖设备厂家推荐排行榜:PP鱼池、微滤机、不锈钢微滤机、锦鲤池微滤机一体机、全自动污水过滤器、生物过滤器、循环水养殖系统公司推荐随着水产养殖行业的快速发展,高效、环保的养殖设备成为提升养殖效益的…

预测不可预测之物的校准学习技术

本文探讨了校准学习在供应链预测中的应用,介绍了Dean Foster与Rakesh Vohra获得时间检验奖的研究成果,阐述了校准技术如何提高预测准确性,以及在机器学习和博弈论中的重要意义。“你正在尝试预测不可预测的事物” 某…

java语言程序设计类与对象课后作业 - 20243867孙堃2405

一、课件代码验证 1. 自定义类与对象使用代码 // 自定义类 MyClass class MyClass {// 私有字段private int value;// 公有字段public String Information;// 方法:设置value值public void setValue(int value) {this…

2025年智能防爆灯/工矿灯厂家推荐排行榜,专业安全与高效照明解决方案!

2025年智能防爆灯/工矿灯厂家推荐排行榜,专业安全与高效照明解决方案!随着工业和矿业领域的快速发展,智能防爆灯和工矿灯的需求日益增长。这些灯具不仅需要满足基本的照明需求,还需要具备高安全性、耐用性和智能化…

AI模型测评平台工程化实战十二讲(第五讲:大模型测评分享机制:安全、高效的结果展示与协作)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Java基础——包机制,JavaDoc生成文档

Java基础——包机制,JavaDoc生成文档包机制 为了更好地组织类,Java提供了包机制,用于区分类名的命名空间 //包语句的语法结构如下 package pkg1[. pkg2[. pkg3...]]; (若文件属于包,必须在首行加上该语句) //使用…