消息队列介绍

news2024/11/15 12:34:33

a79dc56b37314b5a831ecf24d86722a6.gif一、消息队列(MQ)概述

 

消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以简单地描述为:

 

当不需要立即获得结果,但是并发量又需要进行控制的时候,差不多就是需要使用消息队列的时候。

 

消息队列主要解决了应用耦合、异步处理、流量削锋等问题。

 

当前使用较多的消息队列有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等,而部分数据库如Redis、Mysql以及phxsql也可实现消息队列的功能。

 

二、消息队列使用场景

消息队列在实际应用中包括如下四个场景:

 

应用耦合:多应用间通过消息队列对同一消息进行处理,避免调用接口失败导致整个过程失败;

 

异步处理:多应用对消息队列中同一消息进行处理,应用间并发处理消息,相比串行处理,减少处理时间;

 

限流削峰:广泛应用于秒杀或抢购活动中,避免流量过大导致应用系统挂掉的情况;

 

消息驱动的系统:系统分为消息队列、消息生产者、消息消费者,生产者负责产生消息,消费者(可能有多个)负责对消息进行处理;

 

下面详细介绍上述四个场景以及消息队列如何在上述四个场景中使用:

 

2.1 异步处理

具体场景:用户为了使用某个应用,进行注册,系统需要发送注册邮件并验证短信。对这两个操作的处理方式有两种:串行及并行。

 

(1)串行方式:新注册信息生成后,先发送注册邮件,再发送验证短信;

 

 

 

在这种方式下,需要最终发送验证短信后再返回给客户端。

 

(2)并行处理:新注册信息写入后,由发短信和发邮件并行处理;

 

 

 

在这种方式下,发短信和发邮件 需处理完成后再返回给客户端。

 

假设以上三个子系统处理的时间均为50ms,且不考虑网络延迟,则总的处理时间:

 

串行:50+50+50=150ms

并行:50+50 = 100ms

 

若使用消息队列:

 

 

 

并在写入消息队列后立即返回成功给客户端,则总的响应时间依赖于写入消息队列的时间,而写入消息队列的时间本身是可以很快的,基本可以忽略不计,因此总的处理时间相比串行提高了2倍,相比并行提高了一倍;

 

2.2 应用耦合

具体场景:用户使用QQ相册上传一张图片,人脸识别系统会对该图片进行人脸识别,一般的做法是,服务器接收到图片后,图片上传系统立即调用人脸识别系统,调用完成后再返回成功,如下图所示:

 

 

 

该方法有如下缺点:

 

人脸识别系统被调失败,导致图片上传失败;

 

延迟高,需要人脸识别系统处理完成后,再返回给客户端,即使用户并不需要立即知道结果;

 

图片上传系统与人脸识别系统之间互相调用,需要做耦合;

 

若使用消息队列:

 

 

 

客户端上传图片后,图片上传系统将图片信息如uin、批次写入消息队列,直接返回成功;而人脸识别系统则定时从消息队列中取数据,完成对新增图片的识别。

此时图片上传系统并不需要关心人脸识别系统是否对这些图片信息的处理、以及何时对这些图片信息进行处理。事实上,由于用户并不需要立即知道人脸识别结果,人脸识别系统可以选择不同的调度策略,按照闲时、忙时、正常时间,对队列中的图片信息进行处理。

 

2.3 限流削峰

具体场景:购物网站开展秒杀活动,一般由于瞬时访问量过大,服务器接收过大,会导致流量暴增,相关系统无法处理请求甚至崩溃。而加入消息队列后,系统可以从消息队列中取数据,相当于消息队列做了一次缓冲。

 

 

 

该方法有如下优点:

 

请求先入消息队列,而不是由业务处理系统直接处理,做了一次缓冲,极大地减少了业务处理系统的压力;

 

队列长度可以做限制,事实上,秒杀时,后入队列的用户无法秒杀到商品,这些请求可以直接被抛弃,返回活动已结束或商品已售完信息;

 

2.4 消息驱动的系统

具体场景:用户新上传了一批照片, 人脸识别系统需要对这个用户的所有照片进行聚类,聚类完成后由对账系统重新生成用户的人脸索引(加快查询)。这三个子系统间由消息队列连接起来,前一个阶段的处理结果放入队列中,后一个阶段从队列中获取消息继续处理。

 

 

 

该方法有如下优点:

 

避免了直接调用下一个系统导致当前系统失败;

 

每个子系统对于消息的处理方式可以更为灵活,可以选择收到消息时就处理,可以选择定时处理,也可以划分时间段按不同处理速度处理;

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

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

相关文章

如何获取“上帝”的系统版本

如何获取“上帝”的系统版本 在对技术支持过程中,每个公司都难免会遇到这样一个困扰:我们的程序明明在内部环境中测试的好好的,但是到了客户手里总会出现各种问题。 从以往累计的经验来看,这类问题通常和客户的系统环境有关。所…

PHP库存管理系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP库存管理系统 是一套完善的web设计系统,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为PHP APACHE,数据库为 mysql5.0,使用php语言开发。 php 库…

【redis】redis分布式锁(一)手写分布式锁1.0~6.0

redis分布式锁(入门) 文章目录 redis分布式锁(入门)前言一、面试题redis的用法:CAP 二、锁的种类三、一个靠谱分布式锁需要具备的条件和刚需四、分布式锁五、重点六、Base案例(bootredis)1.0、最…

如何使用WordPress建立在线辅导网站(3个步骤)

在线辅导网站在过去几年中变得非常流行。随着越来越多的人转向远程工作和学习,这个行业已成为在家赚取额外收入的绝佳方式。 此外,提供在线指导可以帮助您成为所在领域的权威。 如果您想提供在线辅导,最好的方法通常是通过您自己的辅导网站…

并发编程中的三大问题剖析与解决

java并发编程中的三大问 可见性原因分析:解决: 原子性原因分析:解决: 有序性解决: 首先让我们来了解一下JUC JUC(Java Util Concurrent)是Java提供的一个并发编程工具包,它解决了在多…

【Linux】进程地址空间的初步理解

目录 程序地址空间空间布局图引入物理地址与虚拟地址的概念虚拟地址空间虚拟地址与物理地址是如何对应的?※父子进程独立性的理解(重点)fork两个返回值的原理地址空间为什么要存在?补充理解 程序地址空间空间布局图 (这…

IDEA 新版安装教程

目录 一、安装IDEA 1、双击安装,然后下一步 2、修改默认安装路径,自定义目录。(建议所有开发工具都放在同一个盘符) 3、改为自定义安装路径,下一步。(不用使用中文或空格) 4、创建桌面图标等 5、点击安装&#x…

02.DolphinScheduler数据源中心

文章目录 MySQLHIVE数据源使用HiveServer2使用 HiveServer2 HA Zookeeper Clickhouse MySQL 填写参数 数据源:选择 MYSQL数据源名称:输入数据源的名称描述:输入数据源的描述IP 主机名:输入连接 MySQL 的 IP端口:输入…

一维卷积与一维平均池化的时间复杂度

计算请参考这篇文章: (284条消息) 卷积神经网络的时间、空间复杂度以及数据流的变化_卷积的时间复杂度_Briwisdom的博客-CSDN博客 1. 时间复杂度 时间复杂度即模型的运行次数。 单个卷积层的时间复杂度:Time~O(M^2 * K^2 * Cin * Cout) //有的好奇小宝…

Spring(11. 循环依赖 - 周阳)学习笔记

上一篇 :10. 面试问题简析 文章目录 1. Spring AOP1.1. Aop 常用注解1.2 测试前的准备工作1.2.1 业务类1.2.2 切面类 1.3 Spring4 下的测试1.3.1 POM 文件1.3.2 创建测试类1.3.3 Aop 测试结果 1.4 Spring 5 下的测试1.4.1 POM 文件1.4.2 创建测试类1.4.3 Aop 测试结…

e签宝,「进化」在2023

精准布局生态化、统一化、智能化、信创化,辅以具体产品落地;加速产业、行业、企业、业务,“四业”互通互联,提高产业数字化渗透率。电子签“群战”时代,e签宝再次进化。 作者|斗斗 出品|产业家 “印章在谁手上&…

Camtasia 2023版强悍来袭,会哪些新功能呢?

Camtasia Studio 是一款专门录制屏幕动作的工具,它能在任何颜色模式下轻松地记录 屏幕动作,包括影像、音效、鼠标移动轨迹、解说声音等等,另外,它还具有即时播放和编 辑压缩的功能,可对视频片段进行剪接、添加转场效果…

享受简单上传体验:将Maven仓库迁移到GitHub

前言:我为什么放弃了Maven Central 之前我写过一篇《Android手把手,发布开源组件至 MavenCentral仓库》,文中详细介绍了如何发布组件到Maven Central中供所有开发者共用。但是最近使用下来,发现Sonatype JIRA 的Maven Center上传…

python接口自动化测试 requests库的基础使用

目录 简单介绍 Get请求 Post请求 其他类型请求 自定义headers和cookies SSL 证书验证 响应内容 获取header 获取cookies 简单介绍 requests库简单易用的HTTP库 Get请求 格式: requests.get(url) 注意:若需要传请求参数,可直接在 …

c++STL标准库排序函数std::sort使用

Qt系列文章目录 文章目录 Qt系列文章目录前言一、错误原因二、修改后的代码 前言 C sort()排序函数 C STL 标准库中的 sort() 函数,本质就是一个模板函数。正如表 1 中描述的,该函数专门用来对容器或普通数组中指定范围内的元素进行排序,排序…

【ML】windows 安装使用pytorch

使用pytorch需要python环境,建议是直接装anaconda ,IDE用visual studio anaconda安装 Anaconda 是一个用于科学计算的 Python 发行版,支持 Linux, Mac, Windows, 包含了众多流行的科学计算、数据分析的 Python 包 官网链接anaconda 本人下载…

(转)maven安装及配置(详细版)

1.下载: 方式一可以从官方下载,下载页面:http://maven.apache.org/download.cgi 方式二:或者题主提供的版本下载maven安装包 提取码:ysns 下载好后是一个压缩文件 2.安装: maven压缩包解压到一个没有中文&a…

AI 编程

GitHub Copilot(收费) 开发者:微软 openAI 2022年8月22日之后开始收费,10美元/月,100美元/年。 CodeGeeX(免费) CodeGeeX 可以根据自然语言注释描述(支持中英文注释&#xff09…

20.$refs

$refs是vue操作DOM用的,每一个vue组件实例上,都包含一个$refs对象,里面存储对应的DOM元素或组件的引用,默认情况下$refs对象为空 目录 1 $refs在哪 2 使用ref操作DOM 3 使用ref操作组件 3.1 使用组件方法 3.2 操作组件…

13 JS04——运算符

目标: 1、运算符 2、算数运算符 3、递增和递减运算符 4、比较运算符 5、逻辑运算符 6、赋值运算符 7、运算符优先级 一、运算符 1、概念 运算符(operator)也被称作操作符,是用于实现赋值、比较和执行算数运算等功能的符号。 2…