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

news/2024/7/27 16:37:29/文章来源:https://blog.csdn.net/qq_62525547/article/details/136553040

目录

一、什么是消息队列?

二、消息队列的作用

        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万的数据放到消息队列里,连接消息队列的服务慢慢消费即可,也不至于造成瞬间有百万请求进来,将我的服务压垮。

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

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

四、常见的消息队列

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

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

相关文章

去电脑维修店修电脑需要注意什么呢?装机之家晓龙

每当电脑出现故障时,你无疑会感到非常沮丧。 如果计算机已过了保修期,您将无法享受制造商的免费保修服务。 这意味着您必须自费找到一家电脑维修店。 去电脑维修店并不容易。 大家一定要知道,电脑维修非常困难,尤其是笔记本电脑维…

ElasticSearch之通过search after和scroll解决深度分页问题

写在前面 通过from,size来进行分页查询时,如下: 当from比较大时会有深度分页问题,问题产生的核心是coordinate node需要从每个分片中获取fromsize条数据,当from比较大,整体需要获取的数据量也会比较大&am…

C语言第三十六弹---文件操作(中)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 文件操作 1、文件的顺序读写 1.1、顺序读写函数介绍 1.1.1、fgetc 与 fputc 1.1.2、fgets 与 fputs 1.1.3、fscanf 与 fprintf 1.1.4、fread 与 fwrite 1.…

人工智能(AI)与电网系统的结合

人工智能(AI)与电网系统的结合可以带来许多潜在的好处,包括提高电网的运行效率、安全性和可靠性。以下是一些主要的应用领域,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交…

DevStack 基于 Ubuntu 部署 OpenStack

Devstack 简介 DevStack 是一系列可扩展的脚本,用于基于 git master 的最新版本快速调出完整的 OpenStack 环境。devstack 以交互方式用作开发环境和 OpenStack 项目大部分功能测试的基础。 devstack 透过执行 stack.sh 脚本,搭建 openstack 环境&…

Guitar Pro 8.1中文版永久许可证激活2024最新24位注册激活码生成器

Guitar Pro是一款非常受欢迎的音乐制作软件,它可以帮助用户创建和编辑各种音乐曲谱。从其诞生以来就送专门为了编写吉他谱而研发迭代的。 尽管这款产品可能已经成为全球最受欢迎的吉他打谱软件,在编写吉他六线谱和乐队总谱中始终处于行业领先地位&#…

“色狼”用英语怎么说?柯桥日常英语,成人英语口语学习

最近有粉丝问我"色狼"英文翻译是啥 首先声明不是"colour wolf"哈 关于“色狼”的英文表达有很多 快和C姐一起来看看吧! 1.pervert 这个单词的意思是变态、色狼 是对性变态者最直观的描述 He is such a pervert! I saw him lo…

VMware 集群-虚拟机配置反亲和性(互斥)

简介 博客:https://songxwn.com/ 为实现应用系统的冗余,经常会双机或者多机部署(如数据库集群等)。在VMware 集群里面,要保证不同应用集群的节点虚拟机在不同的物理宿主机上,防止单个宿主机故障&#xff…

数据结构之单链表详解(C语言手撕)

​ 🎉个人名片:🐼作者简介:一名乐于分享在学习道路上收获的大二在校生 🙈个人主页🎉:GOTXX 🐼个人WeChat:ILXOXVJE 🐼本文由GOTXX原创,首发CSDN…

【开源】SpringBoot框架开发数据可视化的智慧河南大屏

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 数据模块 A4.2 数据模块 B4.3 数据模块 C4.4 数据模块 D4.5 数据模块 E 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的数据可视化的智慧河南大屏,包含了GDP、…

连接kafka报错:java.io.IOException: Can‘t resolve address:

修改电脑host文件:C:\Windows\System32\drivers\etc\hosts 加上一行 192.168.1.XXX MHA_SLAVE2(192.168.1.XXX 这个是安装kafka 的服务器地址,MHA_SLAVE2是kafka的容器id)

【数据结构与算法】二分查找题解(二)

这里写目录标题 一、81. 搜索旋转排序数组 II二、167. 两数之和 II - 输入有序数组三、441. 排列硬币四、374. 猜数字大小五、367. 有效的完全平方数六、69. x 的平方根 一、81. 搜索旋转排序数组 II 中等 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必…

c++ 二分查找(迭代与递归)

二分搜索被定义为一种在排序数组中使用的搜索算法,通过重复将搜索间隔一分为二。二分查找的思想是利用数组已排序的信息,将时间复杂度降低到O(log N)。 二分查找算法示例 何时在数据结构中应用二分查找的条件: 应用二分查找算法:…

(C语言)sizeof和strlen的对比(详解)

sizeof和strlen的对⽐(详解) 1. sizeof sizeof是用来计算变量所占内存空间大小的, 单位是字节,如果操作数是类型的话,计算的是用类型创建的变量所占空间的大小。 sizeof 只关注占用内存空间的大小 ,不在乎内…

Rust结构体讲解学习,以及impl结构体方法和结构体关联函数

Rust 中的结构体(Struct)与元组(Tuple)都可以将若干个类型不一定相同的数据捆绑在一起形成整体,但结构体的每个成员和其本身都有一个名字,这样访问它成员的时候就不用记住下标了。元组常用于非定义的多值传…

表单提交 滚动到必填校验位置

handleCommit(flag) {this.$refs["form"].validate((valid, object) > {if (valid) {this.form.checkState flag;this.form.checkLevel 1;this.form.type 1; //规划this.form.filingsId this.form.id;checkFilings(this.form).then((response) > {this.$mo…

list链表的创建,排序,插入, test ok

1. 链表的建立&#xff0c;打印 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <stack> #include <iostream> #include <string.h> #include <string>using namespace std;struct node {int data;s…

后量子时代,未来密码该何去何从?

古有飞鸽&#xff0c;现有网络&#xff0c;在知识经济为基础的信息化社会中&#xff0c;保障网络信息安全无疑成为成为国与国之间无形的较量。小到个人通讯&#xff0c;大到机要信息传输&#xff0c;信息安全对于国家安全和经济活动正常运转至关重要。密码学作为保障网络与信息…

Windows®、Linux® 和 UNIX® 系统都适用的远程桌面工具 OpenText ETX

Windows、Linux 和 UNIX 系统都适用的远程桌面工具 OpenText ETX 为 Windows、Linux 和 UNIX 实施精益、经济高效的虚拟化&#xff1b;提供完整的远程 Windows 可用性&#xff1b;以类似本地的性能远程工作&#xff1b;安全地保护系统和知识产权&#xff08;IP&#xff09;&am…

什么是TikTok账号权重?打破TikTok0播放的方法

许多TikTok账号运营者都会遇到一个难题&#xff0c;那就是视频要么播放量很低&#xff0c;要么0播放&#xff01;不管内容做的多好&#xff0c;最好都是竹篮打水一场空&#xff01;其实你可能忽略了一个问题&#xff0c;那就是账号权重。下面好好跟大家讲讲这个东西&#xff01…