欢迎关注文章系列 ,关注我

《提升能力,涨薪可待》

《面试知识,工作可待》

《实战演练,拒绝996》

也欢迎关注微信公众号【Ccww笔记】,原创技术文章第一时间推出

如果此文对你有帮助、喜欢的话,那就点个赞呗,点个关注呗!

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

场景一:系统解耦

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

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

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

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

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

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

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

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

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

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

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

场景二:异步调用

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

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

因为走完一个链路,需要耗费: >20ms + 200ms + 2000ms(2s) = 2220ms,

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

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

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

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

总结:

  • 1)对用户来说,比同步时更加快捷,用户体验非常好。(让用户以为自己抢到了,欺骗ing )

  • 2)对系统访问压力来说,异步因为没有真正执行,不会造成某时刻对系统的访问压力剧增,而是放入队列,慢慢去消费!

场景三:流量削峰

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

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

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

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

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

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

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

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

总结

解耦与复用

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

异步

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

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

削峰

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

比如,平时可能数据库的读写每秒几百,在流量高峰期,系统的访问达到了每秒10000。此时由于加入了消息队列,所以不会出现激增的访问导致系统奔溃。 >削峰并不会让用户的等待时间减少,所以一般会跟异步搭配来使用

最后MQ还有其他场景,通知、数据分发等等,能体现使用MQ中间件的好处。

也欢迎关注微信公众号【Ccww笔记】,原创技术文章第一时间推出

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

  1. advapi32.dll kernel32.dll 中的两套注册表API

    日前遇到一件事:WebBrowser中的网页会用到一个“大众”ActiveX控件,为了保证兼容性以及和其它程序互不干扰,我们采用这样一种方案: 1. 我们的软件会自带该控件: 2. 如果系统中已注册有 ...

  2. PCES - alpha阶段测试报告

    测试计划 测试目的 本测试目的在于测试项目完成情况,以及分析测试结果,为下一轮开发提供解决方案 测试项目 学生用户登录测试 课程信息检索测试 服务器测试 在测试过程中出现的Bug 用户界面间的跳转逻辑 ...

  3. 移动web页面前端开发总结

    移动web在当今的发展速度是一日千里,作为移动领域的门外汉,在这段时间的接触后,发现前端开发这一块做一个小小的总结. 1.四大浏览器内核 1.Trident (IE浏览器) :因为在早期IE占有大量的 ...

  4. web app开发技巧总结 (share)

    (转自http://hi.baidu.com/kuntakinte/item/ca92d6e5edae9fc0bbf37d08) 自Iphone和Android这两个牛逼的手机操作系统发布以来,在互联 ...

  5. 转载:移动web开发规范

    本文来源:http://blog.csdn.net/joueu/article/details/44329825 以下是规范建议,均是日常在开发当中的的一些经验,仅供参考. 移动web开发规范 一.头 ...

  6. Android开发学习之路-Android Studio真神器!

    放假之后电脑配置升级就开始用Android Studio(下面简称AS)了,那个酸爽真的不是一般的啊,这里开一篇博客来记录下AS里面各种酷炫的功能,有更好玩的,大家不要吝啬,评论告诉我吧! 最近And ...

  7. webapp开发需要注意的浏览器内核知识

    Web App:1.开发成本较低使用web开发技术就可以轻松的完成web app的开发2.升级较简单升级不需要通知用户,在服务端更新文件即可,用户完全没有感觉3.维护比较轻松和一般的web一样,维护比 ...

  8. webApp前端开发技巧总结

    自Iphone和Android这两个牛逼的手机操作系统发布以来,在互联网界从此就多了一个新的名词-WebApp(意为基于WEB形式的应用程序,运行在高端的移动终端设备.我相信各位童鞋应该和我一个样子, ...

  9. Web App开发入门

    WebApp与Native App有何区别呢? Native App: 1.开发成本非常大.一般使用的开发语言为JAVA.C++.Objective-C. 2.更新体验较差.同时也比较麻烦.每一次发布 ...

随机推荐

  1. Class constructor FileManager cannot be invoked without 'new'

    bug:今天项目重新安装依赖打包的时候出现错误:Class constructor FileManager cannot be invoked without 'new' 解决:尝试了很多种解决方案, ...

  2. SQL 方面基础操作,主要针对数据库方面的操作步骤

    SQL 结构化查询语言  适用于所有的SQL数据库 SQL  要求每条指令后末端 都要有分号(;),分号是标准方法,对服务器相同请求中执行一条以上的sql语句. 最终目的: 实现对数据库数据的  增 ...

  3. Java学习笔记十二--集合(三)

    第一节课 返回值 方法名 作用 void add(index,elemnet) 在指定的索引处添加元素 object get(index) 返回指定索引处的元素 int indexOf(object) ...

  4. Yii ActiveRecord用法记录备忘

    ActiveRecord 使用方法 Example1 in查询 $criteria = new CDbCriteria(); $criteria->select = $select; $crit ...

  5. 彻底理解Python多线程中的setDaemon与join【配有GIF示意】

    在进行Python多线程编程时, join() 和 setDaemon() 是最常用的方法,下面说说两者的用法和区别. 1.join () 例子:主线程A中,创建了子线程B,并且在主线程A中调用了B. ...

  6. SpringBoot整合MybatisPlus3.X之SQL注入器(九)

    pom.xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId& ...

  7. vim配置(vimplus)教程及问题

    An automatic configuration program for vim 安装(github地址:https://github.com/chxuan/vimplus.git, 欢迎star ...

  8. 干货:.net core实现读取自定义配置文件,有源代码哦

    看好多人不懂在.NET CORE中如何读取配置文件,我这里分了两篇,上一篇介绍了怎样通过appsettings.json配置读取文件信息.这一篇教大家自定义配置文件: 1.在项目下创建配置文件 { & ...

  9. plsql + instantclient 连接oracle ( 超简单)

    1.instantclient 下载并解压 instantclient 下载地址 https://www.oracle.com/technetwork/cn/database/features/ins ...

  10. 调试webpack

    调试webpack 1. 摘要 用过构建工具webpack的朋友应该都体会,面对其几百行的配置内容如大海一小舟,找不到边.看文档查百度,对其构建的生命周期看了又看.最终还是很茫然.原因很简单,构建配置 ...