一、MQ的基本概念

news2024/11/22 21:04:23

1、初识MQ

MQ全称是Message Queue消息队列,多用于系统之间进行异步通信。队列的概念数据结构中有详细介绍过,先进先出,消息队列就是存储消息的数据结构。 

同步调用和异步调用两者之间的区别:

同步调用:发送方需要等待接收方的响应,待接收方返回结果之后,发送方才会进行后续的处理逻辑。因此同步调用是阻塞模式。

异步调用:发送方不需要等待接收方的响应,发送方将调用消息发到接收方之后,就会继续进行后续的处理逻辑。当被调用的函数或方法执行完成后再回调处理结果。这样可以提高程序的并发性,充分利用计算机资源,提高程序的运行效率。异步调用是非阻塞模式。

其中,MQ是实现系统之间异步通信的常用方式。

如下是两种调用方式的示意图:

                                                      同步调用

                                                      异步调用

 

2、MQ的优势和劣势

下面介绍使用MQ的优势和劣势,其实也是对比【同步调用】和【异步调用】之间的优势劣势。

2.1 优势 

2.1.1 应用解耦

考虑上述这样一个购物场景,用户在订单系统进行下单,在同步调用的方式下,订单系统会依次调用库存系统、支付系统、物流系统,并且在每个系统都返回响应结果之后,才会进行后续调用执行。其中,调用部分的代码都在订单系统中。后续如何系统进行扩展,下单的时候需要调用X系统,那么订单系统部分的代码就需要进行修改,增加X系统的调用。导致系统之间的耦合性过高,扩展极为不便。

而且,如果下单的时候,调用库存系统失败(库存系统短暂停止服务2分钟),那么后续的环节也都会执行失败。即使后面库存系统恢复服务,该笔下单也会失败。

 但是如果我们借助MQ,把系统建设为异步调用的方式,订单系统把订单发布到MQ,之后订单系统继续后续的处理逻辑。库存系统、支付系统、物流系统分别订阅MQ中的消息,进行处理,之后如果需要再把X系统、Y系统纳入,订单系统也不需要进行修改,只需要加入订阅即可。这样系统之间就完成了解耦。

而且,如果下单的时候,恰好遇到库存系统短暂停止服务2分钟,也不会导致下单失败。后面库存系统恢复服务,从MQ中取出订单进行处理即可。

所以,借助MQ,我们实现了应用之间的解耦。

2.2 异步提速

还是上面的购物场景,同步调用的方式,相当于是串行执行,所以整个环节完成之后耗时920ms,对于用户来讲,会感觉到系统响应缓慢,体验不好。

但是,如果通过MQ实现异步调用,订单系统发送到MQ之后,就把“下单成功”的消息返回给用户,之后库存系统、支付系统、物流系统分别从MQ中取消息进行处理,但是这个处理MQ消息的过程我们就不用等待。整个流程的时间只有25ms,大大提升了响应速度和用户体验。

但是,如果库存系统、支付系统、物流系统中的某个系统处理的时候,判断订单不能执行,比如缺少库存怎么办?这个时候根据库存系统返回的消息,订单系统的回调函数会更新订单状态,更新为【订单下单失败,库存不足】。所以一开始返回的“下单成功”消息,更准确的来讲,应该是“下单指令发送成功”,但是订单的最终状态应该等待后面三个系统的处理结果最终决定。

2.3 削峰填谷

 假设我们A系统,每秒钟最大处理1000请求,当请求突然增多,每秒钟来5000请求,就会造成积压,系统处理缓慢,用户后面发来的请求就会等待比较长的时间。

如果我们借助MQ,请求都先进入MQ,然后A系统按照自己的最大处理能力,每秒钟从MQ中取出1000个请求进行处理,系统承担的压力就会减小,消息都积压在MQ中,不会积压在系统端,超出系统的最大承受能力。

 

 2.4 优势总结

 2.2 劣势

 

2.2.1 系统可用性降低

引入MQ之后,系统之间的交互都通过MQ进行,MQ的稳定性非常重要,一旦MQ宕机,整个系统就会瘫痪,因此必须保证MQ的高可用。

2.2.2 系统复杂度提高

引入MQ之后,需要考虑:

  • 消息有没有被重复消费
  • 消息丢失怎么处理
  • 消息传递的顺序性怎么保证

2.2.3  一致性问题

A系统通过MQ向B、C、D系统发送消息,如果B系统和C系统处理成功,D系统处理失败,消息数据处理的一致性如何保证。

2.3 总结

通过上面的介绍,我们进行总结,在什么样的场景下,我们可以选择使用MQ:

  • 生产者不需要从消费者处获得反馈:在尚未获得反馈的情况下,不影响生产者后续的执行。
  • 容许内容短暂的不一致性:以上面的购物场景为例,订单系统发送订单消息之后,返回下单成功的消息,但是这个时候库存系统、支付系统、物流系统尚未处理完成,库存尚未减少,账户金额尚未扣减,和下单成功的状态是不一致的。系统需要能够容许这种数据不一致的情况短暂存在。
  • 确实有效果,且利大于弊:使用MQ的优势获得的收益,大于我们维护MQ付出的成本。 

3、常见的MQ产品

 

 

参考资料:

1、1_MQ的重要性_哔哩哔哩_bilibili

2、https://blog.csdn.net/weixin_44031029/article/details/124169861

3、blog.csdn.net/hong521520/article/details/106671930

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

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

相关文章

使用yapi生成漂亮接口文档

YApi-教程 1. 进入yapi 的菜单 2. 从微服务中导出swagger的json 从浏览器页面访问http://localhost:端口/服务/swagger-ui.html,然后打开浏览器的控制台,查看network,刷新下页面,找到XHR中的api-docs,然后查看res…

【代码】Java中的动态代理实战

文章目录 1. JDK 动态代理2、CGLIB 动态代理 动态代理允许你在运行时创建代理对象,来代替原始对象执行某些操作。这在AOP(面向切面编程)中非常有用,用于实现日志记录、性能监控、事务管理等功能。 Java提供了两种主要的动态代理实…

缓存的设计方式

问题情况: 当有大量的请求到内部系统时,若每一个请求都需要我们操作数据库,例如查询操作,那么对于那种数据基本不怎么变动的数据来说,每一次都去数据库里面查询,是很消耗我们的性能 尤其是对于在海量数据…

【0基础入门Python Web笔记】一、python 之基础语法、基础数据类型、复合数据类型及基本操作

一、python 之基础语法、基础数据类型、复合数据类型及基本操作 基础语法规则基础数据类型数字类型(Numbers)字符串类型(String)布尔类型(Boolean) 复合数据类型List(列表)Tuple&…

【C++代码】有序数组的平方,长度最小的子数组,螺旋矩阵 II--代码随想录

题目:有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 题解 数组其实是有序的, 只不过负数平方之后可能成为最大数了。那么数组平方的最大值就在数组的…

shell 编写一个带有进度条的程序安装脚本

需求 使用 shell 写一个 软件安装脚本,带有进度条 示例 #!/bin/bash# 模拟软件安装的步骤列表 steps("解压文件" "安装依赖" "配置设置" "复制文件" "")# 计算总步骤数 total_steps${#steps[]}# 安装进度的初…

JVM——类加载与字节码技术—类加载器+运行期优化

5.类加载器 jdk的类加载器具有层级关系。 启动类加载器》扩展类加载器》应用程序类加载器》自定义类加载器 对应类加载器只会负责加载对应目录的类。 双亲委派上级机制 应用程序类加载器加载一个类之前会先查询上级加载器是否已经加载过了该类。然后再让上级询问上上级。都…

代码随想录算法训练营第四十四天|LeetCode 309,714

目录 LeetCode 309.最佳买卖股票时机含冷冻期 动态规划五步曲: 1.确定dp[i][j]的含义 2.找出递推公式 3.初始化dp数组 4.确定遍历方向 5.打印dp数组 LeetCode 714.买卖股票的最佳时机含手续费 动态规划五步曲: 1.确定dp[i]的含义 2.找出递推公式 3.初始…

项目构建工具:CMake的核心用法

Golang有go mod、Python有pip、Java有maven。但C语言没有这么好用的包管理工具。当然Conan大概可以算是一个,但其也有自身的局限性,使用起来并不简单。 这就导致我们在写C代码的时候,老是要把心思放在怎么构建项目上。比如有一个项目&#x…

重磅!亚马逊将于10月再次举行秋季会员大促!

今年亚马逊7月份的Prime Day大促出乎卖家意料,效果出奇之好,大促确实有提振销量和信心的奇效。 而在近期,亚马逊宣布,将在今年10月,继续为亚马逊Prime会员带来“Prime秋季会员大促”。 19个国家(包括澳大…

使用BeanShell写入内容到文件【JMeter】

一、前言 ​ 在我们日常工作中,可能会遇到需要将请求返回的数据写入到文件中。在我们使用JMeter进行性能测试时,就经常能够遇到这种情况。要想达到这种目的,我们一般采取BeanShell后置处理器来将内容写入到文件。 二、提取 ​ 在目前大多数的…

使用代理突破浏览器IP限制

一、实验目的: 主要时了解代理服务器的概念,同时如何突破浏览器IP限制 二、预备知识: 代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息。形象的说:它是网络信息的中转站,特别是它具有一个cac…

【Python】从入门到上头—Python基础(2)

文章目录 一.基础语法1.编码2.标识符3.保留字4.注释5.行与缩进6.多行语句7.数字(Number)类型8.字符串(String)9.空行10.等待用户输入11.同一行显示多条语句12.多个语句构成代码组13.print 输出14.import 与 from...import 二.基本数据类型1.变量和赋值2.多个变量赋值3.标准数据…

win10某个软件字体模糊修复

1、在桌面找到该软件,右键选择属性,如下: 2、打开后选择兼容性--更改高DPI设置。 3、点击高DPI缩放替代--应用程序。 4、点击应用,然后退出属性设置。重新打开软件,发现软件字体变得清晰了。

MySQL 保存日期用哪种数据类型

写在前面 在设计数据库表时不可避免的需要用到时间类型,到底选择那种数据类型来表示时间是一个值的讨论的问题,本文就一起来看下! 1:能用哪些数据类型 1:字符串:不要用,占用空间大,至少需要19个字节&…

STM32CubeMx配置HAL库编码器测速

编码器概述 编码器是一种用来测量机械旋转或位移的传感器。它能够测量机械部件在旋转或直线运动时的位移位置或速度等信息,并将其转换成一系 列电信号。按照读出方式编码器可以分为接触式和非接触式两种;按照工作原理编码器可分为增量式和绝对式两类。编…

全局ID生成方式

全局ID生成方式 目录 1. 全局唯一id介绍 1.1 特点 2. 常见的全局唯一id生成策略 2.1 利用数据库自增字段生成id2.2 UUID2.3 Redis生成id2.4 zookeeper生成ID2.5 Twitter的snowflake算法 3. 面试题目:实现一个全局的ID生成器,注意线程安全 3.1 单例模式…

【PCL-9】AABB包围盒

当一个物体边与坐标轴平行时&#xff0c;生成的ABB最小外接立方体有偏差&#xff0c;故这里采用AABB算法。 示例代码&#xff1a; #include <pcl/features/moment_of_inertia_estimation.h> #include <vector> #include <pcl/io/pcd_io.h> #include <pc…

在 Pytorch 中使用 TensorBoard

机器学习的训练过程中会产生各类数据&#xff0c;包括 “标量scalar”、“图像image”、“统计图diagram”、“视频video”、“音频audio”、“文本text”、“嵌入Embedding” 等等。为了更好地追踪和分析这些数据&#xff0c;许多可视化工具应运而生&#xff0c;比如之前介绍的…

机器学习十大算法之七——随机森林

0 引言 集成学习&#xff08;ensemble learning&#xff09;是时下非常流行的机器学习算法&#xff0c;它本身不是一个单独的机器学习算法&#xff0c;而是通过在数据上构建多个横型&#xff0c;集成所有模型的建模结果&#xff0c;基本上所有的机器学习领域都可以看到集成学习…