口试题
- 为什么使用消息队列?
- 消息队列有什么长处和缺点?
- Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别,以及适合哪些场景?
口试官心理分析
其实口试官主要是想看看:
- 第一,你知不知道你们系统里为什么要用消息队列这个东西?
不少候选人,说自己项目里用了 Redis、MQ,但是其实他并不知道自己为什么要用这个东西。其实说白了,就是为了用而用,大概是别人设计的架构,他重新至尾都没思考过。
没有对自己的架构问过为什么的人,一定是平常没有思考的人,口试官对这类候选人印象通常很不好。因为口试官担心你进了团队之后只会木头木脑的干呆活儿,不会自己思考。
- 第二,你既然用了消息队列这个东西,你知不知道用了有什么利益&坏处?
你要是没考虑过这个,那你盲目弄个 MQ 进系统里,后面出了问题你是不是就自己溜了给公司留坑?你要是没考虑过引入一个技术可能存在的弊端和风险,口试官把这类候选人招进来了,基本可能就是挖坑型选手。就怕你干 1 年挖一堆坑,自己跳槽了,给公司留下无穷后患。
- 第三,既然你用了 MQ,可能是某一种 MQ,那么你当时做没做过调研?
你别傻乎乎的自己拍脑壳看个人喜好就瞎用了一个 MQ,比如 Kafka,以致都从没调研过业界流行的 MQ 到底有哪几种。每一个 MQ 的长处和缺点是什么。每一个 MQ 没有绝对的好坏,但是就是看用在哪个场景可以扬长避短,使用其优势,规避其劣势。
假如是一个不考虑技术选型的候选人招进了团队,leader 交给他一个任务,去设计个什么系统,他在内里用一些技术,可能都没考虑过选型,最后选的技术可能并不一定合适,一样是留坑。
口试题剖析
为什么使用消息队列
其实就是问问你消息队列都有哪些使用场景,然后你项目里具体是什么场景,说说你在这个场景里用消息队列是什么?
口试官问你这个问题,期望的一个答复是说,你们公司有个什么业务场景,这个业务场景有个什么技术挑战,假如不消 MQ 可能会很麻烦,但是你现在用了 MQ 之后带给了你很多的利益。
先说一下消息队列常见的使用场景吧,其实场景有很多,但是比较核心的有 3 个:解耦、异步、削峰。
解耦
看这么个场景。A 系统发送数据到 BCD 三个系统,通过接口调用发送。假如 E 系统也要这个数据呢?那假如 C 系统现在不必要了呢?A 系统负责人险些崩溃…
在这个场景中,A 系统跟别的各种乱七八糟的系统严重耦合,A 系统产生一条比较关键的数据,很多系统都必要 A 系统将这个数据发送过来。A 系统要每时每刻考虑 BCDE 四个系统假如挂了该咋办?要不要重发,要不要把消息存起来?头发都白了啊!
假如使用 MQ,A 系统产生一条数据,发送到 MQ 内里去,哪个系统必要数据自己去 MQ 内里消费。假如新系统必要数据,直接从 MQ 里消费即可;假如某个系统不必要这条数据了,就取消对 MQ 消息的消费即可。如许下来,A 系统压根儿不必要去考虑要给谁发送数据,不必要维护这个代码,也不必要考虑人家是否调用乐成、失败超时等情况。
总结:通过一个 MQ,Pub/Sub 发布订阅消息这么一个模型,A 系统就跟别的系统彻底解耦了。
口试本领:你必要去考虑一下你负责的系统中是否有雷同的场景,就是一个系统大概一个模块,调用了多个系统大概模块,互相之间的调用很复杂,维护起来很麻烦。但是其实这个调用是不必要直接同步调用接口的,假如用 MQ 给它异步化解耦,也是可以的,你就必要去考虑在你的项目里,是不是可以运用这个 MQ 去进行系统的解耦。在简历中体现出来这块东西,用 MQ 作解耦。
异步
再来看一个场景,A 系统接收一个请求,必要在自己当地写库,还必要在 BCD 三个系统写库,自己当地写库要 3ms,BCD 三个系统分别写库要 300ms、450ms、200ms。最终请求总延时是 3 + 300 + 450 + 200 = 953ms,接近 1s,用户感觉搞个什么东西,慢死了慢死了。用户通过浏览器发起请求,等候个 1s,这险些是不可接受的。
一样平常互联网类的企业,对于用户直接的操纵,一样平常要求是每个请求都必须在 200 ms 以内完成,对用户险些是无感知的。
假如使用 MQ,那么 A 系同一连发送 3 条消息到 MQ 队列中,假如耗时 5ms,A 系统从接受一个请求到返回响应给用户,总时长是 3 + 5 = 8ms,对于用户而言,其实感觉上就是点个按钮,8ms 以后就直接返回了,爽!网站做得真好,真快!
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
削峰
每天 0:00 到 12:00,A 系统风平浪静,每秒并发请求数量就 50 个。结果每次一到 12:00 ~ 13:00 ,每秒并发请求数量突然会暴增到 5k+ 条。但是系统是直接基于 MySQL 的,大量的请求涌入 MySQL,每秒钟对 MySQL 执行约 5k 条 SQL。
一样平常的 MySQL,扛到每秒 2k 个请求就差不多了,假如每秒请求到 5k 的话,可能就直接把 MySQL 给打死了,导致系统崩溃,用户也就没法再使用系统了。
但是高峰期一过,到了下战书的时候,就成了低峰期,可能也就 1w 的用户同时在网站上操纵,每秒中的请求数量可能也就 50 个请求,对整个系统险些没有任何的压力。
假如使用 MQ,每秒 5k 个请求写入 MQ,A 系统每秒钟最多处置惩罚 2k 个请求,因为 MySQL 每秒钟最多处置惩罚 2k 个。A 系统从 MQ 中逐步拉取请求,每秒钟就拉取 2k 个请求,不要超过自己每秒能处置惩罚的最大请求数量就 ok,如许下来,哪怕是高峰期的时候,A 系统也绝对不会挂掉。而 MQ 每秒钟 5k 个请求进来,就 2k 个请求出去,结果就导致在中午高峰期(1 个小时),可能有几十万以致几百万的请求积存在 MQ 中。
这个短暂的高峰期积存是 ok 的,因为高峰期过了之后,每秒钟就 50 个请求进 MQ,但是 A 系统依然会按照每秒 2k 个请求的速度在处置惩罚。以是说,只要高峰期一过,A 系统就会快速将积存的消息给解决掉。
消息队列有什么优缺点
长处上面已经说了,就是在特殊场景下有其对应的利益,解耦、异步、削峰。
缺点有以下几个:
- 系统可用性降低
系统引入的外部依赖越多,越容易挂掉。本来你就是 A 系统调用 BCD 三个系统的接口就好了,人 ABCD 四个系统好好的,没啥问题,你偏加个 MQ 进来,万一 MQ 挂了咋整,MQ 一挂,整套系统崩溃的,你不就完了?如何保证消息队列的高可用,可以点击这里查看。
- 系统复杂度进步
硬生生加个 MQ 进来,你怎么保证消息没有重复消费?怎么处置惩罚消息丢失的情况?怎么保证消息传递的顺序性?头大头大,问题一大堆,痛楚不已。
- 一致性问题
A 系统处置惩罚完了直接返回乐成了,人都以为你这个请求就乐成了;但是问题是,要是 BCD 三个系统那边,BD 两个系统写库乐成了,结果 C 系统写库失败了,咋整?你这数据就不一致了。
以是消息队列现实是一种非常复杂的架构,你引入它有很多利益,但是也得针对它带来的坏处做各种额外的技术方案和架构来规避掉,做好之后,你会发现,妈呀,系统复杂度提升了一个数量级,大概是复杂了 10 倍。但是关键时刻,用,还是得用的。
Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点?
特性ActiveMQRabbitMQRocketMQKafka单机吞吐量万级,比 RocketMQ、Kafka 低一个数量级同 ActiveMQ10 万级,支持高吞吐10 万级,高吞吐,一样平常共同大数据类的系统来进行实时数据计算、日志采集等场景topic 数量对吞吐量的影响topic 可以达到几百/几千的级别,吞吐量会有较小幅度的下降,这是 RocketMQ 的一大优势,在同等机器下,可以支持大量的 topictopic 从几十到几百个时候,吞吐量会大幅度下降,在同等机器下,Kafka 只管保证 topic 数量不要过多,假如要支持大规模的 topic,必要增长更多的机器资源时效性ms 级微秒级,这是 RabbitMQ 的一大特点,耽误最低ms 级耽误在 ms 级以内可用性高,基于主从架构实现高可用同 ActiveMQ非常高,分布式架构非常高,分布式,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用消息可靠性有较低的概率丢失数据基本不丢经过参数优化设置,可以做到 0 丢失同 RocketMQ功能支持MQ 范畴的功能极其完备基于 erlang 开发,并发能力很强,性能极好,延时很低MQ 功能较为完善,还是分布式的,扩展性好功能较为简单,主要支持简单的 MQ 功能,在大数据范畴的实时计算以及日志采集被大规模使用 综上,各种对比之后,有如下建议:
一样平常的业务系统要引入 MQ,最早大家都用 ActiveMQ,但是现在确实大家用的不多了,没经过大规模吞吐量场景的验证,社区也不是很活泼,以是大家还是算了吧,我个人不推荐用这个了;
厥后大家开始用 RabbitMQ,但是确实 erlang 语言阻止了大量的 Java 工程师去深入研究和掌控它,对公司而言,险些处于不可控的状态,但是确实人家是开源的,比较稳固的支持,活泼度也高;
不过现在确实越来越多的公司会去用 RocketMQ,确实很不错,毕竟是阿里出品,但社区可能有突然黄掉的风险(现在 RocketMQ 已捐给 Apache,但 GitHub 上的活泼度其实不算高)对自己公司技术实力有绝对自信的,推荐用 RocketMQ,否则回去老老实实用 RabbitMQ 吧,人家有活泼的开源社区,绝对不会黄。
以是中小型公司,技术实力较为一样平常,技术挑战不是特殊高,用 RabbitMQ 是不错的选择;大型公司,底子架构研发实力较强,用 RocketMQ 是很好的选择。
假如是大数据范畴的实时计算、日志采集等场景,用 Kafka 是业内标准的,绝对没问题,社区活泼度很高,绝对不会黄,何况险些是全世界这个范畴的毕竟性规范。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |