|阿里面试问消息队列MQ,原来是这么回答的


1.为什么要使用消息队列
先说一下消息队列常见的使用场景吧 , 其实场景有很多 , 但是比较核心的有 3 个:解耦、异步、削峰 。 解耦 看这么个场景 。 A 系统发送数据到 BCD 三个系统 , 通过接口调用发送 。 如果 E 系统也要这个数据呢?那如果 C 系统现在不需要了呢?A 系统负责人几乎崩溃…
|阿里面试问消息队列MQ,原来是这么回答的
本文插图

在这个场景中 , A 系统跟其它各种乱七八糟的系统严重耦合 , A系统产生一条比较关键的数据 , 很多系统都需要 A 系统将这个数据发送过来 。 A 系统要时时刻刻考虑 BCDE四个系统如果挂了该咋办?要不要重发 , 要不要把消息存起来?头发都白了啊!
如果使用 MQ , A 系统产生一条数据 , 发送到 MQ 里面去 , 哪个系统需要数据自己去 MQ 里面消费 。 如果新系统需要数据 , 直接从 MQ 里消费即可;如果某个系统不需要这条数据了 , 就取消对 MQ 消息的消费即可 。 这样下来 , A系统压根儿不需要去考虑要给谁发送数据 , 不需要维护这个代码 , 也不需要考虑人家是否调用成功、失败超时等情况 。
|阿里面试问消息队列MQ,原来是这么回答的
本文插图

总结:通过一个 MQ , Pub/Sub 发布订阅消息这么一个模型 , A 系统就跟其它系统彻底解耦了 。
这里我们可以回顾一下自己曾经负责的系统中是否有类似的场景 , 就是一个系统或者一个模块 , 调用了多个系统或者模块 , 互相之间的调用很复杂 , 维护起来很麻烦 。 但是其实这个调用是不需要直接同步调用接口的 , 如果用 MQ 给它异步化解耦 , 也是可以的 , 你就需要去考虑在你的项目里 , 是不是可以运用这个 MQ 去进行系统的解耦 。 在简历中体现出来这块东西 , 用 MQ 作解耦 。
异步
再来看一个场景 , A 系统接收一个请求 , 需要在自己本地写库 , 还需要在 BCD 三个系统写库 , 自己本地写库要 3ms , BCD 三个系统分别写库要 300ms、450ms、200ms 。 最终请求总延时是 3 + 300 + 450 + 200 = 953ms , 接近 1s , 用户感觉搞个什么东西 , 慢死了慢死了 。 用户通过浏览器发起请求 , 等待个 1s , 这几乎是不可接受的 。
|阿里面试问消息队列MQ,原来是这么回答的
本文插图

一般互联网类的企业 , 对于用户直接的操作 , 一般要求是每个请求都必须在 200 ms 以内完成 , 对用户几乎是无感知的 。
如果使用 MQ , 那么 A 系统连续发送 3 条消息到 MQ 队列中 , 假如耗时 5ms , A 系统从接受一个请求到返回响应给用户 , 总时长是 3 + 5 = 8ms , 对于用户而言 , 其实感觉上就是点个按钮 , 8ms 以后就直接返回了 , 爽!网站做得真好 , 真快!
|阿里面试问消息队列MQ,原来是这么回答的
本文插图

削峰
每天 0:00 到 12:00 , A 系统风平浪静 , 每秒并发请求数量就 50 个 。 结果每次一到 12:00 ~ 13:00, 每秒并发请求数量突然会暴增到 5k+ 条 。 但是系统是直接基于 MySQL的 , 大量的请求涌入 MySQL , 每秒钟对 MySQL 执行约 5k 条 SQL 。
一般的 MySQL , 扛到每秒 2k 个请求就差不多了 , 如果每秒请求到 5k 的话 , 可能就直接把 MySQL 给打死了 , 导致系统崩溃 , 用户也就没法再使用系统了 。
但是高峰期一过 , 到了下午的时候 , 就成了低峰期 , 可能也就 1w 的用户同时在网站上操作 , 每秒中的请求数量可能也就 50 个请求 , 对整个系统几乎没有任何的压力 。
|阿里面试问消息队列MQ,原来是这么回答的
本文插图


推荐阅读