消息队列MQ

news/2025/1/11 22:47:49/

一、消息队列

        网络端的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.ppmy.cn/news/1107864.html

相关文章

从业 20 年的行业老炮儿,如何看待 AI 的风险与能力边界?

点击文末“阅读原文”即可参与节目互动 后期 / 卷圈 监制 / 姝琦 产品统筹 / bobo 联合制作 / RTE开发者社区 随着近期 AIGC 技术和应用的发展落地,有人期待有人担忧,「AI for Social Good」再次成为一个避不开的热门话题。构建 AI 的未来,…

Flash存储芯片:NOR Flash、NAND Flash、UFS和eMMC的比较与解析

前言 在数字化时代的今天,数据的存储和管理变得越来越重要。各种各样的存储技术应运而生,以满足不同的使用场景和需求。其中,Flash存储芯片以其非易失性、可擦写性和可编程性等优势,占据了重要地位。本博客将详细介绍Flash存储芯片…

WebSocket vs SSE: 实时数据推送到前端的选择与实现(详细)

Websocket和Server-Sent Events 对比推送数据给前端及各自的实现 二者对比WebSocket:Server-Sent Events (SSE):选择 WebSocket 还是 SSE: Websocket 实现使用原生 WebSocket API:使用 Netty 创建 WebSocket:总结和选择…

C++之智能指针shared_ptr死锁问题(二百)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

Linux下使用libuvc读取控制USB免驱摄像头

一、前言 libuvc是一个开源的库,用于在Linux和其他操作系统上与USB视频设备进行交互。提供了一组函数和接口,使开发人员可以轻松地访问和控制USB摄像头。 libuvc库实现了对UVC(USB Video Class)设备的支持。UVC是一个标准的USB设备类别,用于视频流传输和摄像头控制。通过…

Pyspark综合案例(pyspark安装和java运行环境配置)

一、RDD对象 PySpark支持多种数据的输入,在输入完成后,都会得到一个:RDD类的对象 RDD全称为:弹性分布式数据集(Resilient Distributed Datasets) PySpark针对数据的处理,都是以RDD对象作为载…

调教 文心一言 生成 AI绘画 提示词(Midjourney)

文章目录 第一步第二步第三步第四步第五步第六步第七步第八步 文心一言支持连续对话 我瞎玩的非专业哈哈 第一步 你好,今天我们要用扩散模型创建图像。我会给你提供一些信息。行吗? 第二步 这是Midjourney的工作原理:Midjourney是另一个基于ai的工具,能…

Ubuntu 安装redis数据库,并设置开机自启动

1、下载安装包 wget http://download.redis.io/releases/redis-7.0.9.tar.gz 2、解压 tar -zxvf redis-7.0.9.tar.gz 3、复制到解压缩的包移动到/usr/local/ sudo mv ./redis-7.0.9 /usr/local/ 4、编译 cd /usr/local/redis-7.0.9 sudo make 5、测试: 时间会比较长&#xff0…