大白话说---“消息队列”

目录

一、什么是消息队列?

二、消息队列的作用

        1.解耦

        2.削峰

        3.异步

三、消息队列的使用场景

        1.传统设计

        2.加入消息队列后的优化

四、常见的消息队列


一、什么是消息队列?

        从名称上,我们就可以得到两个关键信息,即“消息”和“队列”,也就是存放消息的队列。队列这种数据结构我们非常熟悉,是一种先进先出的数据结构。

        回想一下,我们熟悉的数据库,常见的有MySQL、Redis等数据库,MySQL是一种关系型数据库,更多的是存储关系,有特定结构的数据,并且表和表之间通常会有很强的关联,要求强一致性,例如学校有哪些学院,有哪些专业,每个专业又都属于那个学院这种关系。

        而Redis是一种存储在内存中的非关系型数据库,他对数据并没有那么强的一致性要求,存储的数据也是非特定结构的,即非关系型数据库中的数据之间可以是不同结构的,这种数据库的水平拓展能力比较强。由于又是存储在内存中,所以,其读写速度很快。

        如果我们对数据通常是随机读取的话,那么用内存存储会比用磁盘存储会快很多。但是,如果我们是顺序存储的话,那么两者的速度差别就不是很大了。而消息队列就是基于顺序增量存储的特点来存储数据的。

        消息队列:一般我们会简称它为MQ(Message Queue)。他是一种基于顺序增量存储的特点的数据存储区。对于消息队列,可以举一个场景,“接收快递”是我们生活中再正常不过的事情了。但是,通常情况下,我们并不是直接从快递员手中取走快递,而是让快递员暂时将快递存储在“菜鸟驿站”的一些地方,然后我们就可以在空闲时间去驿站取走自己的快递。而驿站便是起到一个消息队列的作用,快递员(生成者)将快递(数据或者消息)存放在驿站(消息队列)中,我们(消费者)根据自身情况去驿站(消息队列)取走快递(数据或者消息)。这样,我们就不用适时地去响应快递员取走快递。对于生产者来说,我们是顺序增量存储在驿站中的,消费者是从驿站中取走消息的。

二、消息队列的作用

        1.解耦

        首先,我们要搞清楚“解耦”是什么意思?

        解耦是指通过降低代码之间的依赖性,减少模块或组件之间的耦合程度。在软件开发中,解耦是一种良好的设计原则,它可以提高代码的可维护性、可测试性和可扩展性。

        当两个模块或组件之间高度耦合时,它们的改动往往会相互影响,一个模块的修改可能会导致其他模块的变动,这增加了系统的复杂性和风险。

        还是上述的快递例子,对于快递员来说,他只要将快递放置在驿站即可,而不需要将快递亲手交给用户。快递员和用户之间不再存在直接联系,而是通过驿站进行较弱的联系,快递员的相关操作发生改变的时候,并不会直接影响到用户。

        通过解耦,可以使系统更加灵活、可扩展和可维护。当一个模块需要修改或替换时,对其他模块的影响将最小化,使系统更具弹性和可扩展性。

        2.削峰

        削峰的意思,就是削减峰值,来降低压力。

        当快递员(生成者)对于一个用户(消费者)来说,该用户(消费者)有大量的快递(消息),如果没有消息队列,那么,当快递员发送大量数据成功后,用户需要适时去接受数据,此时对于用户来说,压力是比较大,而且需要适时去响应快递员,否则快递员会一直的等待,进而严重影响效率。

        引入驿站(消息队列)后,如果快递员有大量快递,只需要将快递存在驿站中即可,然后快递员就可以进行下一个操作,用户也不需要适时,或者突然接受大量快递,而是等自身空闲时,从驿站取出即可,减少了用户压力。

        3.异步

        异步也就是不一定要按照一定的顺序执行,而是可以一起执行。

        与异步相对的就是同步,同步就是要求必须按照一定的顺序执行。

        应用于“发取快递”的场景,也就是用户和快递员前往驿站并不是有一定顺序的,也就是,并不是快递员前往驿站以后用户才可以去,或者相反。用户和快递员之间互不影响。

三、消息队列的使用场景

        1.传统设计

        如果说业务体量小,并发不大,那么,我们可以采用服务模块相互联系,按顺序的同步执行,进而完成请求。

        对于上面的设计,属于典型的串行化调用,这种设计模式有一个很大的优势,就是代码简单,出现问题很容易定位到问题。但是也有很多劣势: 

                高可用:这些服务假如有一个服务挂掉(宕机或者网络波动),就意味着我这个请求失败了,这样用户体验会极差,用户会频繁看到支付失败。

                高并发:因为这些操作都是由一个线程(主线程)去执行这些操作,所以当我们的QPS如果很高的话,很容易造成超时。

                QPS:系统每秒钟收到的请求。

                高性能:因为上面这种设计模式是串行的,假设我的每次网络传输耗时200ms,业务处理需要20ms,完成上面那些操作需要耗时2s,这样用户体验也会很差(想象一下每次下单都需要等2s),如果用户下单后的操作越来越多,耗时只会越来越高。

        所以在一个大型的互联网项目中,以上设计是完全不可取的(非核心模块除外)。

        2.加入消息队列后的优化

        通过上述的“快递”的例子,我们就可以很容易理解下面这个图的流程。只是在联系的时候加上了一个属性topic,具有相同topic的请求才会被对应的微服务调用。

        微服务是什么?

        可以参考本人的这篇博客:微服务基础

        对于这种设计可以继续用高可用、 高并发、高性能三个方面来分析:

                高可用:当我系统里的一个模块宕机了,不会影响到我其他服务(可以通过数据补偿或者分布式事务来保证数据最终一致性),并且分布式架构会有其他相同的业务模块来进行替补,进而完成任务。

                高并发:高性能:用户下单,将下单所需要的数据都放到消息队列里,就直接返回了,所有耗时相当于就是网络传输所耗时。用户只要下单就可以得到响应,即只交给了消息队列,然后消息队列和微服务之间来合理完成服务。

                高性能:由于消息队列不处理任何业务上的逻辑,所有他支持的并发是百万级别的。假如有100万个用户下单,100万的数据放到消息队列里,连接消息队列的服务慢慢消费即可,也不至于造成瞬间有百万请求进来,将我的服务压垮。

        但是,这种设计也是有缺点的,也就是对中心消息队列的依赖高,如果消息队列崩溃,整个系统便不能运行。并且增加了系统复杂性。如果说你的业务量不大,并发也不高,就没必要使用消息队列。并且,时效性也不强,因为是消息队列慢慢消化执行的。

        为了保证可用性,我们可以采用消息队列集群,前端流量限流等。

四、常见的消息队列

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ODI报错

三月 08, 2024 1:20:09 下午 oracle.odi.mapping 信息: Start generation of map physical design: MapPhysicalDesign New_Mapping.物理 三月 08, 2024 1:20:09 下午 oracle.odi.mapping 信息: Finished generation of map physical design: MapPhysicalDesign New_Mapping.物…

Word背景图片设置,提升文章美观度的4个小技巧!

“我才刚开始使用Word,想问问大家Word中背景图片应该怎么设置呢?有什么比较好用的设置方法可以分享一下吗?” 在日常办公中,我们经常需要使用Word来对文件进行处理。在编写Word时,如果给文档加入背景图片,会…

用云手机进行舆情监测有什么作用?

在信息爆炸的时代,舆情监测成为企业和政府决策的重要工具。通过结合云手机技术,舆情监测系统在品牌形象维护、市场竞争、产品研发、政府管理以及市场营销等方面发挥着关键作用,为用户提供更智能、高效的舆情解决方案。 1. 品牌形象维护与危机…

猫冻干价格差距大,定价合理吗?价位合适的主食冻干推荐

随着养猫知识的普及,主食冻干喂养受到越来越多铲屎官的欢迎。然而,价格仍是部分铲屎官的考虑因素。事实上,像我这样的资深铲屎官,早已开始主食冻干喂养。虽然主食冻干价格稍高,但其为猫咪带来的好处是无法替代的。 对于…

【动态规划.2】5292. 跳台阶

承接上一篇 升级版&#xff0c;别怕&#xff0c;上一篇弄会了&#xff0c;这个就是 豆芽菜✌️ https://www.acwing.com/problem/content/description/5295/ f1.递归 #include <bits/stdc.h> // 2024-03-08 Come on ! using namespace std; #define ll long l…

git克隆过程报错

设置 git config 来强制 git 使用 HTTP 1.1 git config --global http.version HTTP/1.1想将其设置回 HTTP2&#xff0c;你可以这样做 git config --global http.version HTTP/2

金相显微镜(金相镜)主要用于材料金相分析 我国市场集中度较低

金相显微镜&#xff08;金相镜&#xff09;主要用于材料金相分析 我国市场集中度较低 金相显微镜又称为金相镜&#xff0c;是指通过光学放大&#xff0c;对材料显微组织、低倍组织和断口组织等进行分析研究和表征的光学显微镜。金相显微镜通常由目镜、物镜、照明系统、旋转台等…

Midjourney绘图欣赏系列(七)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子&#xff0c;它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同&#xff0c;Midjourney 是自筹资金且闭源的&#xff0c;因此确切了解其幕后内容尚不…

数据结构与算法第二套试卷大题

1.选择排序&#xff0c;插入排序的思路 1.1选择排序思路&#xff1a; 1.每次在数组中选一个最小的元素与第一个元素进行交换——>2.然后逐步缩小数组&#xff0c;重复第一&#xff0c;二步 1.2举例&#xff1a; 假设有一个无序数组 [5, 2, 8, 3, 1]&#xff0c;使用选择排序…

kasan排查kernel内存越界示例(linux5.18.11)

参考资料&#xff1a; 1&#xff0c;内核源码目录中的Documentation\dev-tools\kasan.rst 2&#xff0c;KASAN - Kernel Address Sanitizer | Naveen Naidu (naveenaidu.dev) 一、kasan实现原理 KASAN&#xff08;Kernel Address SANitizer&#xff09;是一个动态内存非法访…

《JAVA与模式》之模板方法模式

系列文章目录 文章目录 系列文章目录前言一、模板方法模式的结构二、模板方法模式中的方法三、使用场景四、模板方法模式在Servlet中的应用前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了…

RN开发搬砖经验之-如何处理FlashList组件加载后调用scrollToIndex没有滚动指定位置

前言 如题&#xff0c;这里只能说是处理&#xff0c;起正向作用的临时方案&#xff0c;因为我也着实没搞懂这个BUG的具体原因&#xff0c;看github上有提相关的issuesFor long lists with different item types scrollToIndex does not work reliable&#xff0c;但看官方没有…

操盘风控系统的功能设计与实现

文章目录 一、账户信息风控警报系统是什么二、操盘警报风控系统的意义三、风控系统功能参数设置短信通知及邮件通知参数手机远程风控新闻风险控制常规Bug检测、交易纪律控制参数账户净值、手数、单数、盈亏控制参数价格时间风控、定时平仓 一、账户信息风控警报系统是什么 警报…

WPF学习三(MVVM+自定义按钮等的登录界面)

跟着bilibil龙马哥视频做的一个登录界面&#xff0c;个人感觉讲得很到位&#xff0c;适合新手&#xff09;&#xff0c;他是从开始的前后绑定慢慢解耦合到MVVM&#xff0c;让我较快的理解了WPF的基础。 【WPF入门】WPF零基础到精通&#xff0c;从概念到实操&#xff0c;步步提升…

「AI工程师」模型训练与部署-工作指导

工作指导书 一、工作职责 负责AI模型的训练和优化&#xff0c;确保模型性能达到预定目标。协调资源的分配&#xff0c;管理训练过程中的各种参数和配置。负责模型的部署工作&#xff0c;确保模型能够稳定、高效地运行在实际环境中。监控模型的运行状态&#xff0c;及时处理和…

Python实现滚动加权最小二乘法回归模型(RollingWLS算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 滚动加权最小二乘法回归模型&#xff08;Rolling Weighted Least Squares, RollingWLS&#xff09;是一…

基于SSM的房客源信息管理系统设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 相关技术 3 1.1 SSM框架 3 1.2 Vue框架 3 1.3 ECharts 3 1.4 JQuery技术 3 1.5 本章小结 4 2系统分析 5 2.1 需求分析 5 2.2 非功能需求 8 2.3 本章小节 8 3 系统设计 9 3.1 系统总体设计 9 3.1.1 系统体系结构 9 3.1.2 系统目录结构 9 3…

MySQL 针对逗号拼接的数据字段转行思路

一、MySQL 针对逗号拼接的数据字段转行思路 在 MySQL 中我们有可能为了方便操作&#xff0c;有时会将一个字段存储多个信息&#xff0c;使用英文逗号隔开&#xff0c;当然这种情况属于对数据库的设计上有些欠妥。但如果遇到了这种情况又需要对数据进行统计的情况就有点棘手了&…

直流负载原理与应用

直流负载是指能够消耗直流电能的设备或系统&#xff0c;在电力系统中&#xff0c;直流负载主要包括直流电动机、蓄电池、电解槽等。这些设备在运行过程中需要消耗大量的直流电能&#xff0c;因此对直流电源的稳定性和可靠性要求较高。本文将对直流负载的原理及其应用进行简要介…

二叉树(属性、修改与构造)

226. 翻转二叉树 题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]答案 class Solution {public TreeNode invertTree(TreeNode roo…