消息队列MQ

一、消息队列

        网络端的Http请求默认采用的是同步请求方式,客户端与服务器端是基于请求和响应模式进行通信的。也就意味着,客户端发起请求。必须要等待服务器端完成处理结果给客户端才能继续进行下一步操作,如果服务器发送网络延迟、宕机、卡顿那么客户端势必会受到影响。

        基于这个问题下,MQ应运而生。MessageQueue消息队列,是一个按照先进先出队列设计的容器,主要用于对系统中产生的消息进行存储和消费。使用消息队列主要为了通过异步处理提高系统性能和降低峰值、降低系统耦合度等目的。主流的消息队列有:ActiveMQ、RabbitMQ、Kafka、RocketMQ。

        消息队列的本质其实就是生产-消费模型。系统运行过程中,按照不同的应用场景,不断地产生消息并发送至消息队列;当需要使用消息时,则按照先进先出的方式取出队列中的消息,进而消费消息。

 二、消息中间件的应用场景

        1.异步处理

        实际应用:短信通知、终端状态推送、App推送、用户注册等。

        设想一下当前场景:用户完成注册后,要实现发送注册邮件及注册短信功能。

        (1)串行方式:

        

                客户端发起请求,注册信息写入数据库后,先实现发送注册邮件,再发送注册短信耗时150毫秒。

        (2)并行方式:

        

                客户端发起请求,注册信息写入数据库后,同时执行发送注册邮件和短信耗时100毫秒。

        (3)如果引入消息中间件,即为

        

                将想要发送的消息写入消息队列,再由消息队列异步读取消费消息,这个过程耗时55毫秒,几乎等同于注册信息写入数据库,极大的提高了系统吞吐量。

        2.流量控制

        我们经常可以见到的例子,在某些直播间或者节日活动去秒杀某类热销商品时,如果说请求超过了一定的上限很容易造成服务器瘫痪的情况,这就造成了一定成度的麻烦。利用消息队列可以有效的阻隔相应的请求从而减少服务器的压力。

        

        在通过网关服务将请求转发到后端服务时,通过消息队列隔离网关和后端服务,来达到流量控制和保护后端服务的目的。设置消息队列的最大限制数,在达到最大数量时网关不再生产消息到消息队列中,例如:秒杀活动下,商品数量为100即消息队列的上限,超过100时下一个用户请求直接返回秒杀失败。

        3.服务解耦

        微服务架构服务与服务之间的通信是面向接口编程,如果引入消息队列,消息存储于消息队列中,当前服务有需要则从MQ获取消息消费即可,不需要也可以不消费。

        

        4.发布订阅

        用户想要获取消息队列中的消息,必须先注册订阅该消息。

        

        5.高并发缓冲

        系统在某个时间点的访问量巨大,依然超出了后端接口的每秒最大处理能力,这就导致服务器过载,响应延迟甚至于服务器宕机。

        针对这样场景吗,可以利用消息队列将临时数据写入消息队列,由消息队列临时缓存至磁盘,降低高峰数据对后端的短暂冲击。

 三、常见消息中间件

常见消息队列
特性MQActiveMQRabbitMQRocketMQKafka
是否支持生产者消费模式
是否支持发布订阅模式
是否支持请求回应模式××
Api完整性

是否支持多语言

Java

单机吞吐量万级万级万级十万级
消息延迟微妙级毫秒级毫秒级
可用性高(主从)高(主从)非常高(分布式)非常高(分布式)
消息丢失几乎不几乎不
文档的完备性较高
提供快速入门
社区活跃度
商业支持××商业云商业云

        以上就是对消息队列的初步认识喽。

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

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

相关文章

使用C语言EasyX 创建动态爱心背景

简介 在计算机图形学的世界中,有很多方法可以使程序的界面更加吸引人。在本篇博客中,我将向大家介绍如何使用 EasyX 图形库在 C 中创建一个动态的爱心背景。这不仅是一个简单的动画效果,它还包括背景的星星、旋转的心形以及一个美观的背景渐…

Java基于SpringBoot+Vue的 4S店车辆管理系统

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈3 功能总览4 系统设计4.1 系统设计主要功能4.2 数据库设计4.2.1 数据库设计规范4.2…

freeRTOS系列教程之freeRTOS入门与工程实践【文档+视频教程+进阶视频教程】

《freeRTOS入门与工程实践》 前言课程内容授课方式 学前知识普及学前准备硬件准备资料准备 视频教程文档教程更好的阅读体验 前言 课程内容 嵌入式软件工程师的学习路线一般是:单片机->RTOS->Linux。当你掌握单片机开发后,如果要进一步提升编程水…

VUE 的eslint 代码规范检查

报错: You may use special comments to disable some warnings. Use // eslint-disable-next-line to ignore the next line. Use /* eslint-disable */ to ignore all warnings in a file. 解决: 注释:...(config.dev.useEslint ? [creat…

go初识iris框架(七) - 实战资源导入和项目框架搭建

实战项目框架搭建 如下是项目框架搭建后的说明: config::项目配置文件及读取配置文件的相关功能controller:控制器目目录,项目各个模块的控制器及业务逻辑处理的所在目录datasource:实现mysql连接和操作、封装操作mysql数据库的目录。model:数据实体目…

趣解设计原则之《只是买台咖啡机,竟然要学习咖啡器的运行原理?》

〇、小故事 小王最近工作特别的忙,每天要早出晚归,睡眠质量很差,为了可以精力充沛的投入到每天的工作中,她都在上班路上买一杯公司楼下的星巴克咖啡来提提神。咖啡味道很好,但是每天买咖啡的人真的是太多了&#xff0…

Linux编辑器-vim使用

文章目录 前言一、vim编辑器1、vim的基本概念2、vim的基本操作2.1 命令模式切换至插入模式2.2 插入模式切换至命令模式2.3 命令模式切换至底行模式 3、vim命令模式命令集3.1 移动光标3.2 删除文字3.3 复制与粘贴3.4 替换3.5 撤销上一次操作3.6 更改3.7 跳至指定的行 4、vim末行…

关于运行franka_ros包中的franka_gazebo报错VMware: vmw_ioctl_command error 无效的参数.

参考的博文,感谢,解决Vmware下虚拟机下打开gazebo报错 ,VMware: vmw_ioctl_command error 无效的参数. 首先第一个VMware: vmw_ioctl_command error 无效的参数的问题。这应该是虚拟机的bug,毕竟使用虚拟机和真实的物理机上是有差…

C语言实现三子棋游戏(详解)

目录 引言: 1.游戏规则: 2.实现步骤: 2.1实现菜单: 2.2创建棋盘并初始化: 2.3绘制棋盘: 2.4玩家落子: 2.5电脑落子: 2.6判断胜负: 3.源码: 结语&…

GB28181学习(三)——心跳保活

心跳保活 要求: 1. 当原设备发现工作异常时,应立即向本SIP监控域的SIP服务器发送状态信息; 2. 无异常时,定时向本SIP监控域的SIP服务器发送状态信息; 3. 状态信息报送采用**MESSGAE**方法; 4. SIP设备宜在…

简简单单教你如何用C语言实现获取当前所有可用网口!

一、获取本机所有可用网卡名 原理: 在 Linux 系统中,/proc 目录是一个位于内存中的伪文件系统。 /proc目录是内核提供给我们的查询中心,通过查询该目录下的文件内容,可以获取到有关系统硬件及当前运行进程的信息,如…

leetcode 54. 螺旋矩阵

1. 题解 如果一条边从头遍历到底,则下一条边遍历的起点随之变化选择不遍历到底,可以减小横向、竖向遍历之间的影响一轮迭代结束时,4条边的两端同时收窄 1一轮迭代所做的事情变得很清晰:遍历一个“圈”,遍历的范围收缩为…

日常开发小汇总(3)js类型判断

1.typeof 能判断出字符串、数字、方法和undefined,array、null、object判断不出 let num 1;let str "x";let fn function user(){}let arr [1,2]let obj {name:"zhangs"}let und;let nul null;console.log(typeof num) //numberconsole.l…

JAVAEE初阶相关内容第八弹--多线程(初阶)

本文目录 阻塞队列 阻塞队列是什么? 标准库中的阻塞队列 生产者消费者模型 阻塞队列的实现 普通队列实现: 入队列: 出队列: 完整代码: 加阻塞 加锁 加阻塞 阻塞队列 队列:先进先出,…

量化:基于支持向量机的择时策略

文章目录 参考机器学习简介策略简介SVM简介整体流程收集数据准备数据建立模型训练模型测试模型调节参数 参考 Python机器学习算法与量化交易 利用机器学习模型,构建量化择时策略 机器学习简介 机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。…

请重新安装msvcp140.dll的修复方法,多种msvcp140.dll的处理方案

当你在电脑上安装或运行某些程序时出现了“缺少msvcp140.dll”或“msvcp140.dll丢失”会要求你“重新安装msvcp140.dll”等的错误提示,这意味着你的计算机缺少了一个重要的动态链接库文件。msvcp140.dll是微软Visual C Redistributable for Visual Studio 2015库的一…

硬件总线基础07:PCIe总线基础-事务层(2)

说在开头:关于哲学 在《东邪西毒》电影里欧阳锋说:“看来你的年纪也有四十出头了,这四十多年来,总有些事你是不愿再提,或是有些人不想再见,有的人曾经对不起你,也许你想过杀了他们,…

vue2中使用富文本编辑器tinyMCE全过程

第一步:安装TinyMCE $npm install tinymce5.10.0 -S $npm install tinymce/tinymce-vue3.0.1 -S 第二步:在node_modules中找到tinymce文件夹将内部文件移入pubilc/tinymce文件夹中在index.html文件中引入tinymce.min.js 注意:不把js文件放…

在 Arweave 中轻松管理文件:借助 4EVERLAND 完成 Web3 前端Path Manifests的终极指南

为什么使用Path Manifests? 当在 IPFS 上发布 NFT 时,图片和元数据会被上传到 IPFS 网络以获得一个根 CID,其形式如下: ipfs://bafybeic36ik6cngu37xbzmpytuvyo7z3lyeen44clkkxq5d263zj4nkzr4 通过使用这个根 CID,每…

运算放大器典型应用(二)

文章目录 十、采样保持电路十一、有源滤波电路二阶有源低通滤波器问题二阶截至频率如何算 十、采样保持电路 十一、有源滤波电路 给单片机供电R一般大于4.1Ω小于10Ω,太大会产生功耗 二阶有源低通滤波器问题 二阶截至频率如何算 通频带比较窄可以用这种&#xff0…