一、MQ的基本概念
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
相关文章:
一、MQ的基本概念
1、初识MQ MQ全称是Message Queue,消息队列,多用于系统之间进行异步通信。队列的概念数据结构中有详细介绍过,先进先出,消息队列就是存储消息的数据结构。 同步调用和异步调用两者之间的区别: 同步调用:发…...
Android面试题:MVC、MVP、MVVM
MVC模式: MVC结构: 1.MVC(Model-View-Controller) 2.Model:对数据库的操作、对网络等的操作都应该在Model里面处理,当然对业务计算,变更等操作也是必须放在的该层的。 3.View:主要包括一下View及ViewGroup控件,可以是…...
vue js 回调函数 异步处理 为什么要 let that = this
1 异步就是开个事务(只有主线程 等主线程空闲),用that 值 做处理,然后返回处理结果,而that的值是开启事务那一刻的this的值.而在主线程处理的时候,this的一直在变化, that的值保留在那一刻 ps 或是将本obj 传递给其他的obj使用处理 ps 开启新事务或开启新子线程都是 在新的ob…...
前端面试:【算法与数据结构】常见数据结构解析
在计算机科学中,数据结构是组织和存储数据的方式。精通常见的数据结构对于解决计算机科学和编程问题至关重要。本文将深入探讨常见的数据结构:数组、链表、栈、队列和哈希表,以帮助你建立坚实的数据结构基础。 1. 数组(Array&…...
RTSP/Onvif视频服务器EasyNVR安防视频云服务平台出现崩溃并重启的情况解决方案
EasyNVR安防视频云服务平台的特点是基于RTSP/Onvif协议将前端设备统一接入,在平台进行转码、直播、处理及分发,在安防监控场景中,EasyNVR可实现实时监控、云端录像、云存储、告警、级联等视频能力,极大满足行业的视频监控需求。 有…...
软考高级系统架构设计师系列论文九十四:论计算机网络的安全性设计
软考高级系统架构设计师系列论文九十四:论计算机网络的安全性设计 一、计算机网络安全性设计相关知识点二、摘要三、正文四、总结一、计算机网络安全性设计相关知识点 软考高级系统架构设计师:计算机网络...
jenkins Linux如何修改jenkins 默认的工作空间workspace
由于jenkins默认存放数据的目录是/var/lib/jenkins,一般这个var目录的磁盘空间很小的,就几十G,所以需要修改jenkins的默认工作空间workspace 环境 jenkins使用yum安装的 centos 7 正题 1 查看jenkins安装路径 [rootlocalhost jenkins_old_data]# rpm…...
Mysql报错 mysqladmin flush-hosts
出现这个的原因是错误连接达到数据库设置的最大值。 此时需要释放重置连接最大值。 进入mysql使用命令 flush-hosts;环境说明: 内网测试服务器192.168.18.251 为WEB服务器,安装了mysql; 内网音视频转码服务器192.168.18.253安装了转码工具࿰…...
javaee idea创建maven项目,使用el和jstl
如果使用el表达式出现下图问题 解决办法 这是因为maven创建项目时,web.xml头部声明默认是2.3,这个默认jsp关闭el表达式 办法1 在每个需要用到el和jstl的页面的上面加一句: <% page isELIgnored"false" %> 方法2 修改web.xml文件开…...
同一个服务器发布两个前端(网站)
一开始怎么设置都是505,后来把网站文件的位置换到原已经发布成功的网站位置,就成功了。考虑应该是权限问题 server {listen 80;server_name localhost;# https配置参考 start#listen 443 ssl;# 证书直接存放 /docker/nginx/cert/ 目录下即…...
部署常用指南
https://docs.conda.io/en/latest/miniconda.html#installing 环境配置 安装和配置 Anaconda 安装 Anaconda。 配置镜像源: yaml conda配置 vim ~/.condarc channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro/ - https://mirrors.tuna.ts…...
4.5 TCP优化
TCP 三次握手的性能提升 三次握手的过程在一个 HTTP 请求的平均时间占比 10% 以上,所以要正确使用三次握手的中参数,需要先用netstat命令查看是哪个握手阶段出了问题,主动发起连接的客户端优化相对简单些,而服务端需要监听端口&a…...
pdf太大怎么压缩大小?这样压缩文件很简单
工作和学习中,用到PDF文件的机会还是比较多的,但有时候PDF文件过大会给我们带来困扰,比如上传PDF文件时会因超出系统大小导致无法上传,这时候简单的解决方法就是压缩PDF文件,下面就来看看具体的操作方法吧~ 方法一&…...
【IMX6ULL驱动开发学习】09.Linux之I2C框架简介和驱动程序模板
参考:Linux之I2C驱动_linux i2c驱动_风间琉璃•的博客-CSDN博客 目录 一、I2C驱动框架简介 1.1 I2C总线驱动 1.2 I2C设备驱动 二、I2C总线-设备-驱动模型 2.1 i2c_driver 2.2 i2c_client 2.3 I2C 设备数据收发和处理 三、Linux I2C驱动程序模板…...
【seaweedfs】3、f4: Facebook’s Warm BLOB Storage System 分布式对象存储的冷热数据
论文地址 Facebook的照片、视频和其他需要可靠存储和快速访问的二进制大型对象(BLOB)的语料库非常庞大,而且还在继续增长。随着BLOB占用空间的增加,将它们存储在我们传统的存储系统-- Haystack 中变得越来越低效。为了提高我们的存储效率(以Blob的有效复…...
基于亚马逊云科技服务,构建大语言模型问答知识库
随着大语言模型效果明显提升,其相关的应用不断涌现呈现出越来越火爆的趋势。其中一种比较被广泛关注的技术路线是大语言模型(LLM)知识召回(Knowledge Retrieval)的方式,在私域知识问答方面可以很好的弥补通…...
SpingMVC拦截器-用户登录权限控制分析
视频链接:08-SpringMVC拦截器-用户登录权限控制代码实现2_哔哩哔哩_bilibili 114 1、做了一个用户跟角色添加的相关操作 1.1 这个后台工程,没有进行相关操作也能够进行登录: 2、现在我做一个用户的权限控制,如果当前我没有进行操…...
MDTA模块(Restormer)
From a layer normalized tensor Y ∈ R H ^ W ^ C ^ \mathbf{Y} \in \mathbb{R}^{\hat{H} \times \hat{W} \times \hat{C}} Y∈RH^W^C^, our MDTA first generates query ( Q ) (\mathbf{Q}) (Q), key ( K ) (\mathbf{K}) (K) and value ( V ) (\mathbf{V}) (V) project…...
C++ 新特性 | C++ 11 | decltype 关键字
一、decltype 关键字 1、介绍 decltype 是 C11 新增的一个用来推导表达式类型的关键字。和 auto 的功能一样,用来在编译时期进行自动类型推导。引入 decltype 是因为 auto 并不适用于所有的自动类型推导场景,在某些特殊情况下 auto 用起来很不方便&…...
2023国赛数学建模思路 - 案例:退火算法
文章目录 1 退火算法原理1.1 物理背景1.2 背后的数学模型 2 退火算法实现2.1 算法流程2.2算法实现 建模资料 ## 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 退火算法原理 1.1 物理背景 在热力学上&a…...
ubuntu20.04 编译安装运行emqx
文章目录 安装依赖编译运行登录dashboard压力测试 安装依赖 Erlang/OTP OTP 24 或 25 版本 apt-get install libncurses5-dev sudo apt-get install erlang如果安装的erlang版本小于24的话,可以使用如下方法自行编译erlang 1.源码获取 wget https://github.com/erla…...
ARM linux ALSA 音频驱动开发方法
+他V hezkz17进数字音频系统研究开发交流答疑群(课题组) 一 linux ALSA介绍 ALSA (Advanced Linux Sound Architecture) 是一个用于提供音频功能的开源软件框架。它是Linux操作系统中音频驱动程序和用户空间应用程序之间的接口。ALSA 提供了访问声卡硬件的低级别API,并支持…...
设计模式二十三:模板方法模式(Template Method Pattern)
定义了一个算法的框架,将算法的具体步骤延迟到子类中实现。这样可以在不改变算法结构的情况下,允许子类重写算法的特定步骤以满足自己的需求 模版方法使用场景 算法框架固定,但具体步骤可以变化:当你有一个算法的整体结构是固定…...
[Linux]进程状态
[Linux]进程状态 文章目录 [Linux]进程状态进程状态的概念阻塞状态挂起状态Linux下的进程状态孤儿进程 进程状态的概念 了解进程状态前,首先要知道一个正在运行的进程不是无时无刻都在CPU上进行运算的,而是在操作系统的管理下,和其他正在运行…...
Python爬虫逆向实战案例(五)——YRX竞赛题第五题
题目:抓取全部5页直播间热度,计算前5名直播间热度的加和 地址:https://match.yuanrenxue.cn/match/5 cookie中m值分析 首先打开开发者工具进行抓包分析,从抓到的包来看,参数传递了查询参数m与f,同时页面中…...
js识别图片中的文字插件 tesseract.js
使用方法及步骤 1.安装依赖 npm i tesseract.js 2.引入插件 import { createWorker } from tesseract.js;//worker多线程引入这个import Tesseract from tesseract.js;//js单线程引入这个 3.使用插件识别图片 //使用worker线程识别(async () > {console.time()const wo…...
Linux设备驱动移植(设备数)
一、设备数 设备树是一种描述硬件信息的数据结构,Linux内核运行时可以通过设备树将硬件信息直接传递给Linux内核,而不再需要在Linux内核中包含大量的冗余编码 设备数语法概述 设备树文件 dts 设备树源文件 dtsi 类似于头文件,包含一些公共的…...
【移动端开发】鸿蒙系统开发入门:代码示例与详解
一、引言 随着华为鸿蒙系统的日益成熟,越来越多的开发者开始关注这一新兴的操作平台。本文旨在为初学者提供一份详尽的鸿蒙系统开发入门指南,通过具体的代码示例,引导大家逐步掌握鸿蒙开发的基本概念和技术。 二、鸿蒙系统开发基础 鸿蒙系…...
Jenkins的流水线详解
来源:u.kubeinfo.cn/ozoxBB 什么是流水线 声明式流水线 Jenkinsfile 的使用 什么是流水线 jenkins 有 2 种流水线分为声明式流水线与脚本化流水线,脚本化流水线是 jenkins 旧版本使用的流水线脚本,新版本 Jenkins 推荐使用声明式流水线。…...
DIFFEDIT-图像编辑论文解读
文章目录 摘要算法Step1:计算编辑maskStep2:编码Step3:使用mask引导进行解码理论分析: 实验数据集:扩散模型:ImageNet数据集上实验消融实验IMAGEN数据集上实验COCO数据集上实验 结论 论文: 《D…...
wordpress移动端加底部导航/市场调研分析报告模板
来源|雷锋网作者|贝爽AI在生物科学领域再次取得重大突破!美国时间11月30日,谷歌母公司Alphabet旗下人工智能公司DeepMind公开宣布,生物学界50年来的重大难题——蛋白质折叠预测,已被其成功攻克。而攻克这一…...
手机上如何设置wordpress/神马网站快速排名软件
一、常用的前端调试工具 1、Chrome浏览器的调试工具。 2、火狐浏览器的Firebug插件调试工具。 3、IE的开发人员工具等。 二、Chrome浏览器的调试工具的打开方式 1、在网页任意地方右击,选择检查选项。 2、或者在chrome中找到开发者工具或者使用Ctrlshifti打开前…...
哪个网站做欧洲旅行比较好/跨境电商seo是什么意思
扫描仪通常被用于计算机外部仪器设备,通过捕获图像并将之转换成计算机可以显示、编辑、存储和输出的数字化输入设备,已经成为了我们办公和生活的必备设备了,但是很多win7系统用户并不知道要怎么连接扫描仪,其实方法很简单哦&#…...
福州网站建设多少钱/灰色关键词排名技术
Android项目运行时出现 Failed to load E:\eclipse\android-sdk-windows\build-tools\27.0.3\lib\dx.jar Unknown error: Unable to build: the file dx.jar was not loaded from the SDK folder! 可能的原因: 更新了sdk之后才有这个错误,可能是因为项目…...
dede wap网站模板/如何提高网站排名
一般代码本地调试完成后,需要运行到服务器上,比如自动化测试脚本、爬虫脚本等,所以第一步需要将项目上传到服务器,然后在服务器上进行调试和运行但是需要长期维护和开发的项目,这样就繁琐了很多,并且我们时…...
wordpress自带主题/推广app是什么工作
程序员宝藏库:https://gitee.com/sharetech_lee/CS-Books-Store 学习编程语言,练习必不可少,在练习和做题的过程中能够查漏补缺,清楚自己在理论学习过程中的不足和薄弱点,加深对于Python的理解和认识。 请注意&#x…...