RabbitMQ 到底有啥用?

本文涉及的产品
RDS Agent(兼容OpenClaw),2核4GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 一. RabbitMQ 简介

MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。


消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过 队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。


RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。


AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。


二. RabbitMQ 使用场景

1. 解耦(为面向服务的架构(SOA)提供基本的最终一致性实现)

场景说明:用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口。

image.png

传统模式的缺点:

  • 假如库存系统无法访问,则订单减库存将失败,从而导致订单失败
  • 订单系统与库存系统耦合

引入消息队列image.png

订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功


库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作


假如:在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦


为了保证库存肯定有,可以将队列大小设置成库存数量,或者采用其他方式解决。


基于消息的模型,关心的是“通知”,而非“处理”。


短信、邮件通知、缓存刷新等操作使用消息队列进行通知。

image.png

消息队列和RPC的区别与比较:


RPC: 异步调用,及时获得调用结果,具有强一致性结果,关心业务调用处理结果。


消息队列:两次异步RPC调用,将调用内容在队列中进行转储,并选择合适的时机进行投递(错峰流控)


2. 异步提升效率

场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种


1.串行的方式;2.并行方式


(1)串行方式:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户端

image.png

(2)并行方式:将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间

image.png

(3)引入消息队列,将不是必须的业务逻辑,异步处理。改造后的架构如下:


image.png

3. 流量削峰

流量削锋也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛。关于秒杀系列文章可以关注公众号Java技术栈获取阅读。


应用场景:系统其他时间A系统每秒请求量就100个,系统可以稳定运行。系统每天晚间八点有秒杀活动,每秒并发请求量增至1万条,但是系统最大的处理能力只能每秒处理1000个请求,于是系统崩溃,服务器宕机。


之前架构:大量用户(100万用户)通过浏览器在晚上八点高峰期同时参与秒杀活动。大量的请求涌入我们的系统中,高峰期达到每秒钟5000个请求,大量的请求打到MySQL上,每秒钟预计执行3000条SQL。


但是一般的MySQL每秒钟扛住2000个请求就不错了,如果达到3000个请求的话可能MySQL直接就瘫痪了,从而系统无法被使用。但是高峰期过了之后,就成了低峰期,可能也就1万用户访问系统,每秒的请求数量也就50个左右,整个系统几乎没有任何压力。


引入MQ:100万用户在高峰期的时候,每秒请求有5000个请求左右,将这5000请求写入MQ里面,系统A每秒最多只能处理2000请求,因为MySQL每秒只能处理2000个请求。


系统A从MQ中慢慢拉取请求,每秒就拉取2000个请求,不要超过自己每秒能处理的请求数量即可。MQ,每秒5000个请求进来,结果只有2000个请求出去,所以在秒杀期间(将近一小时)可能会有几十万或者几百万的请求积压在MQ中。


这个短暂的高峰期积压是没问题的,因为高峰期过了之后,每秒就只有50个请求进入MQ了,但是系统还是按照每秒2000个请求的速度在处理,所以说,只要高峰期一过,系统就会快速将积压的消息消费掉。


我们在此计算一下,每秒在MQ积压3000条消息,1分钟会积压18万,1小时积压1000万条消息,高峰期过后,1个多小时就可以将积压的1000万消息消费掉。

image.png

三. 引入消息队列的优缺点

优点

优点就是以上的那些场景应用,就是在特殊场景下有其对应的好处,解耦、异步、削峰。


缺点

*系统的可用性降低 *系统引入的外部依赖越多,系统越容易挂掉,本来只是A系统调用BCD三个系统接口就好,ABCD四个系统不报错整个系统会正常运行。引入了MQ之后,虽然ABCD系统没出错,但MQ挂了以后,整个系统也会崩溃。


*系统的复杂性提高 *引入了MQ之后,需要考虑的问题也变得多了,如何保证消息没有重复消费?如何保证消息不丢失?怎么保证消息传递的顺序?


*一致性问题 *A系统发送完消息直接返回成功,但是BCD系统之中若有系统写库失败,则会产生数据不一致的问题。


总结

所以总结来说,消息队列是一种十分复杂的架构,引入它有很多好处,但是也得针对它带来的坏处做各种额外的技术方案和架构来规避。


引入MQ系统复杂度提升了一个数量级,但是在有些场景下,就是复杂十倍百倍,还是需要使用MQ。

相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
存储 索引
数据结构(顺序结构、链式结构、索引结构、散列结构)
数据结构(顺序结构、链式结构、索引结构、散列结构)
|
3月前
|
人工智能 监控 网络安全
2026年开工不想工作?3分钟部署OpenClaw(原Clawdbot)AI助手 24小时为我工作
春节假期结束,不少人刚回到工位就陷入“开工倦怠”:不想回邮件、不想整理报表、不想写代码、不想处理重复琐碎的事务,只想发呆摸鱼,但工作任务堆成山, deadlines 步步紧逼。有没有一种方式,能让AI替我们完成大部分机械性、重复性工作,实现“人在摸鱼,工作已完成”的理想状态?答案就是**阿里云OpenClaw(原Clawdbot)**——一款能7×24小时不间断工作的开源AI自动化助手,无需人工盯守,一句话下达指令,就能自动执行办公、开发、搜索、整理、定时任务等全场景操作。
509 9
|
3月前
|
开发者 Python
Python 3.8的“海象运算符”:让代码更简洁的秘密武器
Python 3.8的“海象运算符”:让代码更简洁的秘密武器
|
安全 Linux 数据安全/隐私保护
CentOS中SELinux的禁用与关闭操作
在禁用SELinux时,你要时刻谨慎小心。SELinux提供了安全功能,并阻止了许多常见的网络攻击,关闭它可能会让你的系统置于风险之中。除非非常确定SELinux为你带来了不必要的麻烦,否则最好的选择往往是留着它,适当地调整和细化你的SELinux策略,来适应你的需求。
1127 19
|
11月前
|
存储 机器学习/深度学习 人工智能
基于Memory Bank的Cursor长会话记忆内存库理论研究与实践
本文探讨了Memory Bank在解决大模型长期记忆问题中的应用,特别是在Cursor编程助手中的实践。Memory Bank通过分层存储、动态更新和精准检索机制,有效克服了传统模型在多轮对话中记忆丢失的问题。文章详细介绍了三种工具:Codelf、cursor-memory-bank-rules.md和One-Shot Memory Bank for Cursor的原理、配置及效果评测。其中,cursor-memory-bank-rules.md表现较好,适合项目梳理,但实际开发中的效果仍有待验证。
2740 11
基于Memory Bank的Cursor长会话记忆内存库理论研究与实践
|
物联网 Linux 云计算
Linux操作系统的演变与未来趋势####
【10月更文挑战第29天】 本文深入探讨了Linux操作系统从诞生至今的发展历程,分析了其在服务器、桌面及嵌入式系统领域的应用现状,并展望了云计算、物联网时代下Linux的未来趋势。通过回顾历史、剖析现状、预测未来,本文旨在为读者提供一个全面而深入的视角,以理解Linux在当今技术生态中的重要地位及其发展潜力。 ####
|
XML JSON API
带你了解淘宝API是如何使用的
淘宝API使用介绍:需先注册开发者账号并创建应用以获取appkey和appsecret。熟悉API文档,了解接口功能和调用方式。调用地址为http://gw.api.taobao.com/router/rest,支持GET/POST方式。调用时需进行签名验证,返回数据主要为xml/json格式,需注意接口访问频次限制等。
带你了解淘宝API是如何使用的
|
Java Android开发 开发者
【编程进阶知识】精细调控:掌握Eclipse JVM参数配置的艺术
本文详细介绍了如何在Eclipse中配置JVM参数,包括内存的初始和最大值设置。通过具体步骤和截图演示,帮助开发者掌握JVM参数的精细调控,以适应不同的开发和测试需求。
456 1
|
关系型数据库 MySQL 数据库
InnoDB 的 MVCC 实现原理
InnoDB 的 MVCC 实现原理
383 0
|
缓存 C语言 计算机视觉
程序与技术分享:CPU0处理器的架构及应用
程序与技术分享:CPU0处理器的架构及应用