首页 > 其他分享 >RabbitMQ的详解和使用

RabbitMQ的详解和使用

时间:2024-06-02 23:43:56浏览次数:26  
标签:异步 队列 系统 RabbitMQ 订单 详解 MQ 消息 使用

一、什么是MQ ?

1、MQ的概念

MQ 全称Message Queue(消息队列),是在消息的传输过程中保存消息的容器。多用于系统之间的异步通信。 下面用图来理解异步通信,并阐明与同步通信的区别。

同步通信:甲乙两人面对面交流,你一句我一句必须同步进行,两人除此之外不做任何事情

 异步通信:异步通信相当于通过第三方转述对话,可能有消息的延迟,但不需要二人时刻保持联系,消息传给第三方后,两人可以做其他自己想做的事情,当需要获取对方说话的内容时,直接从消息队列里获取即可。

 

2、理解消息队列

消息 就是两台计算机间传送的数据单位;本质上就是一段数据,它能被一个或者多个应用程序所理解,是应用程序之间传递的信息载体。消息可以非常简单,例如只包含文本字符串;也可以更复杂地嵌入对象。

队列 是数据结构中概念。在队列中,数据先进先出,后进后出,犹如排队做核酸。

消息队列 MQ是把消息和队列结合起来,称之为消息队列(Message Queue)。把要传输的数据(消息)与队列进行绑定,用队列先进先出机制来实现消息传递。消息队列由 生产者 和 消费者 两部分构成;生产者主要负责产生消息并把消息放入队列中,再由消费者去处理。消费者可以到指定队列中获取消息,或者订阅相应的队列,最后由MQ服务端进行消息推送。

什么是订阅?订阅就是为消费者服务的,消费者提前订阅,当消息队列中有消息产出时,自动去获取消息进行消费。生活中有很多这种例子,比如购买腾讯、优酷等视频会员时就会有订阅模式,当你的会员到期时,会自动帮你完成续费。

二、MQ的优势和劣势

1、优势和作用

应用解耦 例如在我们非常熟悉电商系统平台中,用户下订单需要调用订单系统,订单系统需要调用库存系统、支付系统、物流系统等进行数据交互来完成整个下单业务,这种把整个业务都耦合在一起。很容易出现我们经常遇见的问题:

①、当中间某个环节库存系统或支付系统出现异常或故障,会造成整个订单系统崩溃无法完成订单业务;

②、当我们需求开发时,可能会新增一个其他系统的业务与当前的订单系统关联并进行数据交互,此时就必须修改订单系统的代码。如果系统壮大,业务越来越多,越来越复杂时,随之带来的维护成本也会成指数增加。

 

由此我们不难看出 系统耦合性越高,容错性和可维护性就会越低。如果在系统中引入MQ,即订单系统将消息先发送到MQ中,MQ再将数据消息转发到其他系统,问题就可以得到解决,MQ天生就是来干这个事的。那么当我们加入MQ以后整个系统会发生什么变化?

①、由于订单系统只发消息给MQ,不直接对接其他系统,如果其他任何一个系统出现异常或故障时,不影响整个订单业务的执行。当异常或故障解决以后,程序自动从MQ获取数据信息完成后续相关业务逻辑即可。

②、如果需求修改,新增了一个业务系统,此时无需修改其他系统的代码,只需修改MQ将消息发送给新增的系统即可,实现数据信息的可靠有效传递。使用MQ让系统应用间进行解耦,提升整个系统的容错性和可维护性

 异步提速 开发一款App系统,其登录注册是最为常见的需求,例如注册的业务有手机注册入库、绑定邮箱验证、手机短信验证。

 用户的注册操作需要等待350ms才能得到响应,如果邮件验证系统/手机短信通知系统耗时比较长,那么用户的响应随之就会变长,非常影响客户的体验度,而当使用了MQ后,客户的体验度飙升。

 削峰填谷 假设系统承载的QPS是1000,如果流量顶峰时达到50000,则会造成系统压垮崩溃。使用了MQ之后,限制消费消息的速度为1000,把数据产生的压力放在MQ中,系统的高峰就会被削掉,这个过程叫 削峰,因为消息积压的数据比较多,在高峰期过后的一段时间内,消费消息的速度还会继续维持在这个速度,直到把积压的消息消费完,这个过程叫 填谷。这样可以大大提高系统的稳定性和用户体验。

2、劣势

系统可用性降低: 系统引入的外部依赖越多,系统稳定性越差。一旦MQ宕机,就会对业务造成影响。
系统复杂度提高: MQ的加入大大增加了系统的复杂度,以前系统间是同步的远程调用,现在是通过MQ进行异步调用。
一致性问题 : A系统处理完业务,通过MQ给B、C、D三个系统发消息数据,如果B系统、C系统处理成功,D系统处理失败,则会造成数据处理的不一致。

三、MQ的应用场景

1、高峰流量:抢红包、秒杀活动、抢火车票等这些业务场景都是短时间内需要处理大量请求,如果直接连接系统处理业务,会耗费大量资源,有可能造成系统瘫痪。 而使用MQ后,可以先让用户将请求发送到MQ中,MQ会先保存请求消息,不会占用系统资源,且MQ会进行消息排序,先请求的秒杀成功,后请求的秒杀失败。

 2、消息分发:如电商网站要推送促销信息,该业务耗费时间较多,但对时效性要求不高,可以使用MQ做消息分发

 3、数据同步:假如我们需要将数据保存到数据库之外,还需要一段时间将数据同步到缓存(如Redis)、搜索引擎(如Elasticsearch)中。此时可以将数据库的数据作为消息发送到MQ中,并同步到缓存、 搜索引擎中。

 4、异步处理:在电商系统中,订单完成后,需要及时的通知子系统(进销存系统发货,用户服务积分,发送短信)进行下一步操作。为了保证订单系统的高性能,应该直接返回订单结果,之后让MQ通知子系统做其他非实时的业务操作。这样能保证核心业务的高效及时

 5、离线处理:在银行系统中,如果要查询近十年的历史账单,这是非常耗时的操作。如果发送同步请求,则会花费大量时间等待响应。此时使用MQ发送异步请求,等到查询出结果后获取结果即可。

四、AMQP

1、什么是 AMQP : 即Advanced Message Queuing Protocol(高级消息队列协议),是一个网络协议,专门为消息中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受不同中间件产品,不同开发语言等条件的限制。2006年AMQP规范发布,类比HTTP。

2、AMQP工作过程: 生产者(Publisher)将消息发布到交换机(Exchange),交换机根据规则将消息分发给交换机绑定的队列(Queue),队列再将消息投递给订阅了此队列的消费者

 

标签:异步,队列,系统,RabbitMQ,订单,详解,MQ,消息,使用
From: https://www.cnblogs.com/wjzohou/p/18227835

相关文章

  • 【Python】生成html文档-使用dominate
    原文地址:https://www.cnblogs.com/kaerxifa/p/13035376.htmldominate简介dominate是一个使用优雅的DOMAPI创建和操作HTML文档的Python库。使用它能非常简洁地编写纯Python的HTML页面,这消除了学习另一种模板语言的需要,利用Python更强大的特性。 首先安装依赖:pipinstall......
  • 【大模型应用开发极简入门】构建新闻稿生成器:提示词的使用与基于事实的提示词
    文章目录一.提示词怎么写二.完整代码三.基于事实的promptGPT-4和ChatGPT等LLM专用于生成文本。我们可以使用GPT-4和ChatGPT在各种场景中生成文本,举例如下。电子邮件合同或正式文档创意写作逐步行动计划头脑风暴广告职位描述对于本项目,我们将创建一个工具,它可......
  • 《Linux内核完全注释》学习笔记:2.5 Linux内核对内存的使用方法
    在Linux0.11内核中,为了有效地使用机器中的物理内存,内存被划分成几个功能区域,如图2-9所示。图2-9物理内存使用的功能区域分布图Linux内核程序占据在物理内存的开始部分,接下来是用于供硬盘或软盘等块设备使用的高速缓冲区部分。当一个进程需要读取块设备中的数据时,系统会......
  • 如何使用Node.js、TypeScript和Express实现RESTful API服务
    Node.js是一个基于ChromeV8引擎的JavaScript运行环境。Node.js使用了一个事件驱动、非阻塞式I/O的模型,使其轻量又高效。Express是一个保持最小规模的灵活的Node.jsWeb应用程序开发框架,为Web和移动应用程序提供一组强大的功能。使用Node.js和Express可以快速的实现一个......
  • 小程序抓包实战:Fiddler配置与使用详细
    实验环境FiddlerClassic微信(3.9.10.27)步入正题一,既然要抓包当然我们得先下载了,点击FiddlerClassic即可下载,下载完成后一路下一步就行;二,Fiddler配置,依次打开Tools>Options>HTTPS,勾选图中三项即可如果出现证书提升直接按照;三,设置代理端口以及允许计算机连接,......
  • Python使用BeautifulSoup爬取人人影视的详情页面
    importrequests,jsonfrombs4importBeautifulSoupif__name__=='__main__':url="https://yyets.com/movies/201565/"headers={"User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537......
  • 在Macos上,使用homebrew下载并配置mysql
    下载mysqlbrewinstallmysql启动mysql注意:由于启动mysql的指令会先将在Github上的官方维护的tap克隆到homebrew-services文件夹中,因此需要先确定能够稳定地访问Github如果很不幸你无法稳定的访问Github,我们可以更改homebrew主仓库的git远程地址和homebrew核心软件仓库的git......
  • vue3 使用element plus 方式
    安装依赖npminstallelement-plus--save引入依赖import'./assets/main.css'import{createApp}from'vue'import{createPinia}from'pinia'importAppfrom'./App.vue'importrouterfrom'./router'//从这里引......
  • YOLOv5训练数据集的配置文件格式与使用技巧
    文章目录一·概述二·配置文件说明2.1官方配置文件解析2.2自定义数据集配置文件2.3其他格式指定数据集路径2.4多个数据集路径指定三·总结注意事项一·概述本文档主要记录YOLOv5算法在进行模型训练前,关于加载数据集的配置文件的说明。默认情况下,YOLOv5......
  • strcpy、strncpy、strcat、strncat、strcmp、strstr字符串函数的使用和模拟
    strcpy的使用和模拟(作用)将一个字符串的内容复制到另外一个字符串中代替掉。strcpy的使用效果#include<stdio.h>#include<string.h>intmain(){charstr1[]="Samplestring";charstr2[40];charstr3[40];strcpy(str2,str1);strcpy(str3,"copysucce......