【绝对有收获】看看MQ?必须告诉你为什么要使用MQ消息中间件(图解版)

简介: 假设你有个系统A,这个系统A会产出一个核心数据,现在下游有系统B和系统C需要使用这个数据。

《提升能力,涨薪可待》-为什么要使用MQ消息中间件


场景一:系统解耦


假设你有个系统A,这个系统A会产出一个核心数据,现在下游有系统B和系统C需要使用这个数据。


首先想到最简单,系统A就是直接调用系统B和系统C的接口发送数据给他们就好了


12.png


但是现在要是来了系统D、系统E、系统F、系统G,等等,十来个其他系统都需要这份核心数据呢?


13.png


这是可能会出现开发人员最头疼的、尴尬的问题?


先是来一个人找他要求发送数据给一个新的系统H,系统A的同学要修改代码然后在那个代码里加入调用新系统H的流程。


一会那个系统B是个陈旧老系统要下线了,告诉系统A的同学:别给我发送数据了,接着系统A再次修改代码不再给这个系统B。


那我们现在该怎么做呢?系统的耦合性那么高,这真是牵一发而动全身,小需求需要大改动,何必呢?


现在我们主角要来了,可以使用MQ消息中间件,让我们系统之间耦合度降低。


现在我们只需要将系统A自己的一份核心数据发送到MQ中间件中,下游哪个系统感兴趣自己去消费即可。


这样能达到一次编译不必改,谁爱谁去改,反正我不改。


14.png


总结:通过 MQ 消息中间件的使用,重构系统之间的耦合,让系统具备高度的可扩展性。


场景二:异步调用


假设你有一个系统调用链路,是系统A调用系统B,一般耗时20ms;系统B调用系统C,一般耗时200ms;系统C调用系统D,一般耗时2s


15.png


用户一个请求过来巨慢无比,就像走过长长的套路一样


因为走完一个链路,需要耗费:


20ms + 200ms + 2000ms(2s) = 2220ms,


也就是2秒多的时间。但是实际上,链路中的系统A调用系统B,系统B调用系统C,这两个步骤起来也就220ms。


这时候主角大佬又慢慢的过来了,这都搞不定,不是很简单吗?


实现思路就是系统A -> 系统B -> 系统C,直接就耗费220ms后直接成功了。


然后系统C就是发送个消息到MQ中间件里,由系统D消费到消息之后慢慢的异步来执行这个耗时2s的业务处理。通过这种方式直接将核心链路的执行性能提升了10倍。


16.png


总结:


  • 1)对用户来说,比同步时更加快捷,用户体验非常好。(让用户以为自己抢到了,欺骗ing   )
  • 2)对系统访问压力来说,异步因为没有真正执行,不会造成某时刻对系统的访问压力剧增,而是放入队列,慢慢去消费!


场景三:流量削峰


假设你有一个系统,平时正常的时候每秒可能就几百个请求,系统部署在8核16G的机器的上,正常处理都是OK的,每秒几百请求是可以轻松抗住的。 比如秒杀活动


在秒杀活动在高峰期一下子来了每秒钟几千、万请求,弹指一挥间出现了流量高峰。


17.png


如果时候出现机器宕机,公司损失可是大大的,这是你是不是该准备好被老板痛骂,甚至可能要say goodbye


可能想到的解决的方式,线上部署了很多台机器,一多制胜的方法:


18.png


但是,假设除了秒杀活动达到瞬时高峰,其它时间基本为每秒就几百请求,如果你线上部署了很多台机器,就是为了这次秒杀活动,这有点浪费机器资源。


所以这时,MQ大哥又出现了,不怕,这不是还有我吗?


19.png


在所有机器前面部署一层MQ,平时每秒几百请求大家都可以轻松接收消息。 一旦到了瞬时高峰期,一下涌入每秒几千的请求,就可以积压在MQ里面,然后那一台机器慢慢的处理和消费。


总结:削峰从本质上来说就是更多地延缓用户请求,以及层层过滤用户的访问需求,遵从“最后落地到数据库的请求数要尽量少”的原则。


总结


解耦与复用


系统A要发送一个消息到多个系统,如果此时每增加一个系统,系统A都需要通过修改源码来增加接口,此时耦合非常高,但是如果中间使用消息队列的话,系统只需要发送一次到消息队列,别的系统就能复用该信息,当增加或删除系统调用接口的时候,不需要额外的更新代码。


异步


用户调用一个接口的时候,可能该接口调用了别的方法。例如:用户注册的时候,后台可能需要调用:查询数据库,插入数据库,发送邮件,发送用户指南等等...


但是用户可能并不需要后台将所有的任务执行完毕,那么此时在初入数据口后面加入mq队列,用户就能很快得到注册成功的响应而去做一些别的事情。mq的机制又能保证最终的一致性,所以使用起来很安全很稳定。


削峰


何为削峰,就是当系统压力过大的时候,让系统压力减小。如何做?


比如,平时可能数据库的读写每秒几百,在流量高峰期,系统的访问达到了每秒10000。此时由于加入了消息队列,所以不会出现激增的访问导致系统奔溃。


削峰并不会让用户的等待时间减少,所以一般会跟异步搭配来使用


最后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
目录
相关文章
|
消息中间件 存储 负载均衡
消息中间件的选择:RabbitMQ是一个明智的选择
消息中间件的选择:RabbitMQ是一个明智的选择
319 0
|
消息中间件 存储 中间件
【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka
【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka
13829 1
|
消息中间件 存储 Java
RocketMQ(一):消息中间件缘起,一览整体架构及核心组件
【10月更文挑战第15天】本文介绍了消息中间件的基本概念和特点,重点解析了RocketMQ的整体架构和核心组件。消息中间件如RocketMQ、RabbitMQ、Kafka等,具备异步通信、持久化、削峰填谷、系统解耦等特点,适用于分布式系统。RocketMQ的架构包括NameServer、Broker、Producer、Consumer等组件,通过这些组件实现消息的生产、存储和消费。文章还提供了Spring Boot快速上手RocketMQ的示例代码,帮助读者快速入门。
|
消息中间件 存储 RocketMQ
消息中间件-RocketMQ技术(二)
消息中间件-RocketMQ技术(二)
|
消息中间件 存储 中间件
消息中间件-RocketMQ技术(一)
消息中间件-RocketMQ技术(一)
|
消息中间件 编解码 Docker
Docker部署RabbitMQ消息中间件
【7月更文挑战第4天】Docker部署RabbitMQ消息中间件
572 3
|
消息中间件 存储 Java
吃透 RocketMQ 消息中间件,看这篇就够了!
本文详细介绍 RocketMQ 的五大要点、核心特性及应用场景,涵盖高并发业务场景下的消息中间件关键知识点。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
吃透 RocketMQ 消息中间件,看这篇就够了!
|
消息中间件 缓存 API
消息中间件系列教程(14) -RabbitMQ-自动补偿机制
消息中间件系列教程(14) -RabbitMQ-自动补偿机制
644 0
|
消息中间件 编解码 Docker
【Docker项目实战】Docker部署RabbitMQ消息中间件
【10月更文挑战第8天】Docker部署RabbitMQ消息中间件
849 2
【Docker项目实战】Docker部署RabbitMQ消息中间件
|
消息中间件 存储 Apache
探索 RocketMQ:企业级消息中间件的选择与应用
RocketMQ 是一个高性能、高可靠、可扩展的分布式消息中间件,它是由阿里巴巴开发并贡献给 Apache 软件基金会的一个开源项目。RocketMQ 主要用于处理大规模、高吞吐量、低延迟的消息传递,它是一个轻量级的、功能强大的消息队列系统,广泛应用于金融、电商、日志系统、数据分析等领域。
1442 0
探索 RocketMQ:企业级消息中间件的选择与应用

热门文章

最新文章

相关产品

  • 云消息队列 MQ