一、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

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

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

相关文章

opencv-dnn

# utils_words.txt 标签文件 import osimage_types (".jpg", ".jpeg", ".png", ".bmp", ".tif", ".tiff")def list_images(basePath, containsNone):# return the set of files that are validreturn list_file…

gdb 条件断点

条件断点,顾名思义就是有条件才会触发的断点,一般设置此类断点形如:b xxx if xxx,如: 要触发此断点则需要 is_created 0。打完断点我们也可以用 info b 查看一下当前已经设置的断点信息,如: 断…

探索未知世界:桌面端3D GIS引领地理信息新时代

近年来,桌面端的三维地理信息系统(3D GIS)在地理信息领域迎来了显著的发展,为我们带来了更深入、更丰富的地理空间认知和数据分析体验。从城市规划到环境保护,从资源管理到应急响应,桌面端的3D GIS正逐渐成…

Java程序设计——在一个给定的字符串中查找并解析姓名、出生日期、个人网站、身高和体重信息,并输出相应的结果

package ch4;public class FindMess {public static void main(String[] args) {String mess "姓名:张三 出生时间:1989.10.16。个人网站:http://www.zhang.com。身高:185 cm,体重:72 kg";int index (int)(mess.indexOf(":")); //mess调用indexOf(Stri…

git Update failed cannot lock ref

报错详情 解决方案 百度了很多方案,过滤出了有效方案 去该项目下的.git文件里找到报错文件,本例中即为:.git/refs/tags/pre-RELEASE-PRE-20230817-03 删除该文件,重新pull,pull成功问题解决

Java并发工具类

JDK并发包中常用并发工具类: CountDownLatch、CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段; Exchanger工具类则提供了在线程间交换数据的一种手段。 等待多线程完成的CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成…

Electron学习3 使用serialport操作串口

Electron学习3 使用serialport操作串口 一、准备工作二、 SerialPort 介绍1. 核心软件包(1) serialport(2) serialport/stream(3) serialport/bindings-cpp(4) serialport/binding-mock(5) serialport/bindings-interface 2. 解析器包3. 命令行工具 三、创建一个demo程序1. 创建…

Dapper

介绍 dapper是一款轻量级的ORM Dapper 被称为 ORM 之王。 以下是 Dapper 的主要功能: 速度快,性能快。 更少的代码行。 对象映射器。 静态对象绑定。 动态对象绑定。 轻松处理 SQL 查询。 易于处理存储过程。 直接对 IDBConnection 类进行操作&#xf…

重注微电子产业,“三大齿轮”能否带起香港经济的“第三轮”

文 | 智能相对论 作者 | 佘凯文 众所周知,微电子产业早已成为现代科技领域的关键钥匙,谁能掌握微电子产业,谁就能拥有全球科技领域的话语权。 从上世纪开始,微电子产业曾经历过几次重大转移,如70年代从美国转向日本…

零拷贝技术详解

当涉及到网络编程和IO操作时,数据拷贝是一个常见的性能瓶颈。传统的数据拷贝过程中,数据需要从内核缓冲区复制到用户空间缓冲区,然后再从用户空间缓冲区复制到内核缓冲区,这个过程会耗费大量的CPU时间和内存带宽,降低系…

tensorRT安装

官方指导文档:Installation Guide :: NVIDIA Deep Learning TensorRT Documentation 适配很重要!!!! 需要cuda, cuDNN, tensorRT三者匹配。我的cuda11.3 所以对应的cuDNN和tensorRT下载的是如下版本: cud…

【业务功能篇77】微服务-OSS对象存储-上传下载图片

3. 图片管理 文件存储的几种方式 单体架构可以直接把图片存储在服务器中 但是在分布式环境下面直接存储在WEB服务器中的方式就不可取了,这时我们需要搭建独立的文件存储服务器。 3.1 开通阿里云服务 针对本系统中的相关的文件,图片,文本等…

07-Numpy基础-伪随机数生成

numpy.random模块对Python内置的random进行了补充,增加了一些用于高效生成多种概率分布的样本值的函数。 例如,你可以用normal来得到一个标准正态分布的44样本数组: 而Python内置的random模块则只能一次生成一个样本值。从下面的测试结果中可…

Mybatis查询一条数据

上一篇我们介绍了在pom文件中引入mybatis依赖,配置了mybatis配置文件,通过读取配置文件创建了会话工厂,使用会话工厂创建会话获取连接对象读取到了数据库的基本信息。 如果您需要对上面的内容进行了解,可以参考Mybatis引入与使用…

Python爬虫(十五)_案例:使用bs4的爬虫

本章将从Python案例讲起:所使用bs4做一个简单的爬虫案例,更多内容请参考:Python学习指南 案例:使用BeautifulSoup的爬虫 我们已腾讯社招页面来做演示:http://hr.tencent.com/position.php?&start10#a 使用BeautifulSoup4解析…

[MyBatis系列④]核心配置文件

目录 1、简介 2、DTD 3、typeHandlers 3.1、默认类型处理器 3.2、自定义类型处理器 4、plugins ⭐MyBatis系列①:增删改查 ⭐MyBatis系列②:两种Dao开发方式 ⭐MyBatis系列③:动态SQL 1、简介 MyBatis的核心配置文件(通常命…

基于IDEA使用maven创建hibernate项目

1、创建maven项目 2、导入hibernate需要的jar包 <!--hibernate核心依赖--><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.4.1.Final</version></dependency><!--…

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

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

ARM64函数调用流程分析

ARM64函数调用流程分析 1 ARM64 函数调用实例2 对应代码的分析2.1 main函数及其对应的汇编程序2.1.1 main的C代码实现2.1.2 main函数对应汇编及其分析2.1.3 执行完成之后栈的存放情况 2.2 test_fun_a函数及其对应的汇编程序2.2.1 test_fun_a函数的C实现2.2.2 test_fun_a函数对应…

Oracle的学习心得和知识总结(二十八)|Oracle数据库数据库回放功能之论文二翻译及学习

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《Oracle Database SQL Language Reference》 2、参考书籍&#xff1a;《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…