01_MQ的应用场景及带来的问题
2020-02-20 21:59:04 35 举报
MQ的应用场景及系统中引入MQ带来的问题
作者其他创作
大纲/内容
没有用MQ时系统被高峰期打死场景
MQ队列
5、调用了D系统,D系统在自己本地执行了二条SQL,花费了100ms
C系统
问题1:系统可用性降低:MQ一旦故障,系统A就无法向MQ发送消息。整个系统就崩溃了,就没有办法运转了。
说明:一般的MySQL抗到每秒2000个SQL请求(主要跟机器性能有关)就差不都了,每秒请求达到5000个的话,会被直接打死
系统C
4、此时D不需要A的数据了,让A停止调用D的接口。
系统D
3、E系统需要数据,自已直接从MQ里消费
E系统
说明:我们来计算一下,A系统首先在本地执行了SQL,然后调用了B系统,再调用了C系统,再调用了D系统。一个请求全部完成,共耗时500ms。假如再将执行耗时加长。用户通过浏览器进行请求需要将近一秒,几乎不可以接受。一般互联网企业,对用户的直接操作,一般要求在200ms以内完成,对用户几乎是无感知的。
使用MQ来进行削峰的场景
7、当正常访问期间,1小时30分钟可以将6中的1千万多条积压的消息消费完
B系统
A系统
6、高峰期时MQ每秒5000个请求进来,结果就每秒2000个请求出去,导致中午高峰期(1小时),积压了60秒*60分钟*3000请求=10800000
使用MQ之后的解耦场景
D系统
2、每秒有5千个请求写入MQ
0、调用接口
不用MQ同步高延时请求场景
5、高峰期时系统A也不会挂掉
系统B
问题3:一致性问题,有人给系统A发送一个请求,这个请求应该是系统ABCD都成功才返回的。结果ABC都执行成功,D执行失败了。 整个请求返回给用户是成功的,结果后台逻辑差了一点。
2、哪个系统需要数据自己去MQ消费
4、不需要这条数据,直接取消对MQ消息的消费
1、1百万用户,在中午高峰的时候,每秒有5千个请求
说明:通过一个MQ,发布和订阅一个消息这么一个模型,Pub/Sub模型,系统A跟其它系统彻底解耦
4、调用了C系统,C系统在自己本地执行了四条SQL,花费了200ms
不用MQ系统之间耦合的场景
3、A系统连续发3条消息到3个消息MQ中,发送3条消息总耗时5ms
调用接口
5、中午高峰期过了之后,到了下午也就正常了,可能就1万用户在网站上操作,每秒请求就50个,对系统没有任何压力
问题2:系统系统复杂性变高:需要考虑的问题变多 。1、正常系统A给系统B发送一条数据就可以了,但是因系统A和MQ的协调出现了问题,系统A不小心把同一条数据给系统B发送了两次,导致系统B内部插入了两条一样的数据。2、系统A给MQ直接在MQ就把消息搞丢了。3、系统A发送 m1、m2、m3三条有顺序的消息,结果在MQ中顺序乱了,导致系统B拿到的消息是m2、m3、m1。顺序乱了
2、A系统在本地数据库执行了一条SQL,花费了50ms
系统A
使用MQ进行异步化之后的接口性能优化
MySQL
3、调用接口
1、大量用户(100百万用户)通过浏览器高峰期,同时进行大量操作
4、系统A每秒最多从MQ里拉取2000个请求,不要超过系统每秒处理的最大请求数就OK
1、用户对A系统发起了一次请求
1、E系统也要用A的数据,对A说你来调我接口吧
MQ
1、产生数据,发送到MQ中
总结:计算一下,A系统从接受一个请求到,到返回响应给用户,总时长就是55ms
7、D系统在自己本地执行了二条SQL,花费了100ms
3、系统A从MQ每秒拉取2000个请求,因为MySQL每秒最多能处理2000个请求
4、MySQL被打死,然后整个系统就崩溃,然后用户就没法使用系统了
6、C系统在自己本地执行了四条SQL,花费了200ms
2、大量请求涌入我们的系统中,高峰期达到每秒5000个请求
问题:A系统跟很多系统耦合起来,A产生了一个比较关键的数据,很多系统需要A系统将这个数据发送过来。A还要考虑,B挂了怎么办?C访问超时怎么办?各种问题。
4、每个系统自己从对应的MQ队列中消费消息,从消息中提取参数,在本地执行操作
5、A又不得不把调用D系统接口的代码删除
2、A修改代码,添加调用E系统接口代码,给E发送数据
3、调用了B系统,B系统在自己本地执行了三条SQL,花费了150ms
架构中引入MQ可能存在的一些问题
5、系统A不需要考虑给谁发送数据,不需要维护这个代码,只需要把消息发送至MQ,不需要考虑人家是否调用成功,是否超时?
5、B系统在自己本地执行了三条SQL,花费了150ms
0 条评论
下一页