当前位置: 首页 > news >正文

一、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安装了转码工具&#xff0…...

javaee idea创建maven项目,使用el和jstl

如果使用el表达式出现下图问题 解决办法 这是因为maven创建项目时&#xff0c;web.xml头部声明默认是2.3&#xff0c;这个默认jsp关闭el表达式 办法1 在每个需要用到el和jstl的页面的上面加一句: <% page isELIgnored"false" %> 方法2 修改web.xml文件开…...

同一个服务器发布两个前端(网站)

一开始怎么设置都是505&#xff0c;后来把网站文件的位置换到原已经发布成功的网站位置&#xff0c;就成功了。考虑应该是权限问题 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。 配置镜像源&#xff1a; yaml conda配置 vim ~/.condarc channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro/ - https://mirrors.tuna.ts…...

4.5 TCP优化

TCP 三次握手的性能提升 三次握手的过程在一个 HTTP 请求的平均时间占比 10% 以上&#xff0c;所以要正确使用三次握手的中参数&#xff0c;需要先用netstat命令查看是哪个握手阶段出了问题&#xff0c;主动发起连接的客户端优化相对简单些&#xff0c;而服务端需要监听端口&a…...

pdf太大怎么压缩大小?这样压缩文件很简单

工作和学习中&#xff0c;用到PDF文件的机会还是比较多的&#xff0c;但有时候PDF文件过大会给我们带来困扰&#xff0c;比如上传PDF文件时会因超出系统大小导致无法上传&#xff0c;这时候简单的解决方法就是压缩PDF文件&#xff0c;下面就来看看具体的操作方法吧~ 方法一&…...

【IMX6ULL驱动开发学习】09.Linux之I2C框架简介和驱动程序模板

参考&#xff1a;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)的语料库非常庞大&#xff0c;而且还在继续增长。随着BLOB占用空间的增加&#xff0c;将它们存储在我们传统的存储系统-- Haystack 中变得越来越低效。为了提高我们的存储效率(以Blob的有效复…...

基于亚马逊云科技服务,构建大语言模型问答知识库

随着大语言模型效果明显提升&#xff0c;其相关的应用不断涌现呈现出越来越火爆的趋势。其中一种比较被广泛关注的技术路线是大语言模型&#xff08;LLM&#xff09;知识召回&#xff08;Knowledge Retrieval&#xff09;的方式&#xff0c;在私域知识问答方面可以很好的弥补通…...

SpingMVC拦截器-用户登录权限控制分析

视频链接&#xff1a;08-SpringMVC拦截器-用户登录权限控制代码实现2_哔哩哔哩_bilibili 114 1、做了一个用户跟角色添加的相关操作 1.1 这个后台工程&#xff0c;没有进行相关操作也能够进行登录&#xff1a; 2、现在我做一个用户的权限控制&#xff0c;如果当前我没有进行操…...

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 的功能一样&#xff0c;用来在编译时期进行自动类型推导。引入 decltype 是因为 auto 并不适用于所有的自动类型推导场景&#xff0c;在某些特殊情况下 auto 用起来很不方便&…...

2023国赛数学建模思路 - 案例:退火算法

文章目录 1 退火算法原理1.1 物理背景1.2 背后的数学模型 2 退火算法实现2.1 算法流程2.2算法实现 建模资料 ## 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 退火算法原理 1.1 物理背景 在热力学上&a…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...