`

项目中使用消息队列的原因

阅读更多

为什么要使用消息队列       

      做过互联网企业级应用开发的同学们,不管是在大厂的还是在小厂的,都会知道或熟悉消息队列。那么,在做企业级应用开发的过程中,为啥需要用消息队列呢?下面是小弟在日常工作中整理出来的心得,希望能帮助有需要的同学。

      在正常的项目中使用消息队列,主要是为了以下三种场景:解耦,异步,削峰。下面分别针对这三种场景,做下简单的描述。

      1. 解耦

      在未使用消息队列之前的企业级应用开发的过程中,如果某个系统是产生关键数据的系统,那么其他的系统都会依赖这个系统去获取数据,如下图所示:

      A系统是产生关键数据的系统,所有系统都需要其进行提供数据,导致A系统与要提供数据系统产生耦合,系统拓展,其他系统的需求修改都会导致A系统产生修改。

      使用了消息队列,进行系统解耦以后,如下图所示:

       通过一个MQ,发布和订阅消息的Pub/Sub模型,A系统不需要去考虑要给谁发数据,不需要维护代码,不需要考虑调用方是否成功,失败或超时。这样,就将A系统和其他系统彻底解耦了。

       2. 异步

      如果一个用户发起了一个业务操作,需要几个系统间的一系列请求,同时每一个系统肯都存在一定的耗时。先看下未采用MQ的链路请求及耗时的情况,如下图所示:

       我们来计算一下,系统A先执行本地sql,然后调用系统B,接着调用系统C,最后调用系统D。四个步骤下来,一个请求全部完成,需要耗时的总时长是970ms。这样,用户在浏览器上发起了请求,等待1s,体验很差,用户难以接受。而且,一般的互联网企业,对用户的直接操作,一般要求是200ms以内完成,对用户几乎是无感知的。      

      使用了MQ后,可以利用MQ对不同的系统发送命令,进行异步操作,如下图所示:

      我们可以看到,系统A从收到用户的请求后,26ms内就有返回了,这对于用户而言,体验很好,一个请求26ms,就有返回了。

      3. 削峰

      这一点主要是针对在用户使用高峰期的时候,使用MQ作为cache,以防止MySql被打满,导致请求卡死。我们先来看下未使用MQ的情况,如下图所示:

从上图中的四点,我们可以看出,如果MySql被打死,整个系统就奔溃了,最后,就会导致用户没法使用整个系统了。这里说明一下,一般的MySql扛到每秒2000的请求,也就差不多了。如果每秒5000,有可能会直接把MySql打死。      

       使用MQ作为缓存以后,如下图所示:

高峰取时在MQ中进行大量请求积压,处理器按照自己的最大处理能力取请求量,等请求期过后再把它消耗掉。我们可以简单的计算下,假设每秒在MQ中堆积的消息是3000条,1分钟会堆积18万条消息,1小时会积压1000万条消息。系统A,一个多小时,差不多可以把1000万消息给处理掉,MQ也就没有消息的积压了。

 

消息队列有什么缺点

     1.系统的可用性降低:很多服务都依赖于MQ,一旦MQ故障,系统崩溃。

     2.系统变的复杂,序列考虑问题变多:发送消息重复,多了,乱序,丢掉。

     3.一致性问题:系统A给BCD发送,只有都成功才返回成功,结果BC成功,但是D失败,但是返回页面结果是成功。

 

每一个MQ都有什么异同和适用场景

ActiveMQ

       最早大家都用ActiveMQ,但是现在确实大家用的不多了,没经过大规模吞吐量场景的验证,社区也不是很活跃,单机吞吐量,万级,吞吐量比RocketMQ和Kafka要低了一个数量级,响应为ms级别,有较低的概率丢失数据。

 

RabbitMQ

       单机吞吐率万级,吞吐量比RocketMQ和Kafka要低了一个数量级,但是适合于中小型企业,因为自带了友好的监控和维护界面,社区相对比较活跃,几乎每个月都发布几个版本分,在国内一些互联网公司近几年用rabbitmq也比较多一些,但是问题也是显而易见的,RabbitMQ确实吞吐量会低一些,这是因为他做的实现机制比较重,同时语言在国内很少有人会。

 

RocketMQ

       单机吞吐量10万级,RocketMQ也是可以支撑高吞吐的一种MQ,topic可以达到几百,几千个的级别,吞吐量会有较小幅度的下降,这是RocketMQ的一大优势,在同等机器下,可以支撑大量的topic,可用性非常高,分布式架构,在阿里大规模应用过,有阿里品牌保障,日处理消息上百亿之多,可以做到大规模吞吐,性能也非常好,分布式扩展也很方便,源码是JAVA。

 

Kafka

      单机吞吐量10万级别,这是kafka最大的优点,就是吞吐量高。一般配合大数据类的系统来进行实时数据计算、日志采集等场景。topic从几十个到几百个的时候,吞吐量会大幅度下降。

 

      所以在同等机器下,kafka尽量保证topic数量不要过多。如果要支撑大规模topic,需要增加更多的机器资源,可用性非常高,kafka是分布式的,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用。

分享到:
评论

相关推荐

    01-基于消息队列的进程间通信的设计

    标题中的“01-基于消息队列的进程间通信的设计”指的是一个关于使用消息队列进行进程间通信的项目或课程设计。在这个设计中,开发者可能会深入探讨如何在Linux操作系统环境下利用消息队列来实现不同进程之间的数据...

    分享:消息队列1

    2. **为何使用消息队列** - **核心原因一:解耦**:消息队列提供了一种松耦合的方式,使得系统组件间无需直接通信,降低维护复杂性。 - **核心原因二:异步**:消息队列支持异步处理,改善用户体验,同时提高系统...

    分布式之消息队列复习精讲.docx

    使用消息队列的主要原因包括: ##### 1. 解耦 **传统模式的缺点:** - **系统间耦合性强:** 在传统的系统架构中,系统A通常会直接调用系统B或系统C的功能,这导致系统的耦合性非常强。一旦新增系统D,则需要对...

    07_我的天!我为什么在消息队列里消费到了重复的数据?.zip

    标题 "07_我的天!我为什么在消息队列里消费到了重复的数据?" 暗示了这个压缩包可能包含关于消息队列...通过阅读这些文件,你可以更全面地理解这个问题,并学习如何在实际项目中避免和处理消息队列中的重复数据问题。

    阿里云-消息队列-购买指南.pdf

    总的来说,阿里云消息队列购买指南为企业提供了一个清晰的框架,以帮助他们理解如何购买和使用MQ服务,包括成本控制、服务质量和协议选择等方面。在实施消息队列服务时,用户应根据自身的业务需求、预算和性能要求...

    阿里云 专有云企业版 V3.8.1 微消息队列MQTT 开发指南 20190910

    此外,API参考还会包含各种参数、选项的说明,以及调用示例,帮助开发者在实际项目中集成和利用阿里云的微消息队列服务。 总的来说,阿里云专有云企业版V3.8.1的微消息队列MQTT开发指南为用户提供了全面的技术支持...

    阿里云-消息队列-购买指南-D.docx

    阿里云消息队列(MQ)购买指南主要涵盖了MQ服务的价格说明、计费规则、欠费处理、免费项目以及服务等级协议(SLA)。以下是详细说明: 1. **价格说明**: 阿里云MQ的价格信息可以在MQ产品的价格页面查看。计费周期...

    php+redis实现消息队列功能示例

    个人理解在项目中使用消息队列一般是有如下几个原因: 把瞬间服务器的请求处理换成异步处理,缓解服务器的压力 实现数据顺序排列获取 redis实现消息队列步骤如下: 1).redis函数rpush,lpop 2).建议定时任务入队列 ...

    Laravel中为什么不使用blpop取队列详析

    综上所述,Laravel不使用`blpop`的原因主要是因为它无法提供必要的安全性来确保任务的可靠性,同时在事务中使用`blpop`也无法保持其阻塞特性。Laravel通过`lpop`结合Lua脚本来实现原子性操作,并利用“暂存”集合...

    Java 工程师进阶知识完全扫盲

    一、使用消息队列的原因 面试官:你在系统里用过消息队列吗? 候选人:用过的。 面试官:那你说一下你们在项目里是怎么用消息队列的? 候选人:我们啥啥系统发送个啥啥消息到队列,别的系统来消费啥啥的。 在...

    项目中的问题

    - 在排除了业务逻辑和消息队列的因素后,接下来需要验证JNI的使用方式是否会导致问题。可以通过将JNI相关的代码修改为非单例模式来测试,观察是否存在异常行为。 3. **JNI独立测试:** - 为了进一步验证JNI本身...

    13_微信项目开发05_接受消息的排重方法的解决方案

    通过以上介绍,我们可以看出,在微信项目开发中处理消息排重是一项重要任务,涉及到数据库操作、缓存使用、消息队列等多个技术领域,需要根据实际项目需求和资源状况选择合适的方法。在实践中不断优化和调整,才能...

    django、celery、redis部署定时任务(实现多work、多队列).pdf

    首先,Celery是一个基于消息队列的异步任务队列/作业队列,它主要用于处理大量消息的分布式系统。Celery本身不是任务队列,而是用来管理分布式任务队列的工具。它封装了操作常见任务队列的各种操作,使开发者可以...

    Kafka深度解析.pdf

    下面列举了一些使用消息队列的主要原因: 1. **解耦**:消息队列插入了一个基于数据的接口层,使得生产者和消费者可以独立扩展或修改各自的处理逻辑,而不影响其他部分。这极大地提高了系统的可维护性和灵活性。 2...

    MQ、JMS以及ActiveMQ关系的理解

    在实际的项目中,消息队列经常被用于将一些耗时的操作,如发送邮件、处理文件和执行复杂的报告生成等,从主线程中分离出来,通过异步处理的方式进行。这种方式可以显著降低服务器的请求响应时间,提高系统的吞吐量和...

    rabbitmq代码.zip

    死信队列在RabbitMQ中扮演着至关重要的角色,它是处理那些无法正常路由或者因某些原因被拒绝的消息的队列。这些消息可能是由于路由键不匹配、消息TTL(Time To Live)过期或者是被消费者拒收的。通过设置死信交换机...

    RabbitMQ、RocketMQ、Kafka、ActiveMQ消息中间件常见的面试题目

    了解消息中间件的使用场景是非常重要的,面试官可能会问你为什么使用消息队列,消息队列都有哪些使用场景,然后你项目里具体是什么场景,说说你在这个场景里用消息队列是什么?其实,这个问题期望的一个回答是说,...

    jak_rabbit.zip

    在IT行业中,消息队列(Message Queue)是分布式系统中常用的一种组件,它主要用于解耦应用程序,提高系统的...在Java环境中,使用RabbitMQ的Java客户端库可以轻松地实现与消息队列的交互,确保消息的正确发送和接收。

Global site tag (gtag.js) - Google Analytics