这篇文章,给你们分享一位朋友面试阿里某个部门时的经历。简单说一下这位朋友面试的背景,自己技术底子还不错,在几个有必定知名度的中型互联网公司工做过,而后以前打算尝试一下阿里的职位,就去面试了。面试
第一轮和第二轮面试,所有都经过了,面试官评价也是基本技术素养还能够,基础也不错,定级都是P6+的职级。数据库
可是第三面是那个部门老大P9出来面试他,结果就挂在这里了,因此把这个第三面的一些问题分享出来,给你们参考。缓存
一、业务背景介绍架构
首先这个同窗上来先阐述了一下本身的一些项目经历,当前他在公司里主要是负责一个数据类的系统,业务逻辑并不复杂,可是有一点技术难度。并发
主要是天天都会有人调用他的接口,而后有数据会落入数据库表中。分布式
简化一下来讲,大概是这个背景,以下图:高并发
这个系统天天接口调用大概会落入数据库中有20万左右的数据量,那么每月大概是600万左右的数据量,每一年大概是近亿级的数据量会落入数据库中。性能
可是这是针对整个数据库来讲的,平摊到里面核心的每一个表,大概每一个表每一年新增个千万级别的数据量。学习
二、架构演进考察 spa
系统就是这么个状况,接着面试官就开始发问了。。。
面试官:如今你的系统压力其实不大,天天20万新增数据量也不大,每一年哪怕单表新增千万级数据其实也还算能够接受。第一个问题:若是假设你的系统承载的业务量翻了10倍,天天新增200万数据,你的系统架构要如何演进?
若是你的系统承载的业务量翻了100倍,天天新增2000万数据,你的系统架构要如何演进?
候选人 :这个。。。咱们还没这种需求,因此我暂时还没想过这个问题。。。
面试官心想:(这小伙子想面P6+ ?那是资深Java职位,起码得有点架构演进的意识吧,怎么一点意识都没有)
面试官对面试者的印象有点扣分了。。
旁白解读
实际上这类问题在BAT、美团、京东等大公司里面试,都是常问的,为何呢?由于大公司里的系统面对的就是业务常常翻倍的增加,系统压力愈来愈大,因此每一年都要作几回技术升级,一直要进行架构演进。
因此在互联网公司里,架构设计能力中很是关键的一环,就是针对业务增加,架构演进的能力是很是核心的。
你要有一个意识说若是你的业务量10倍增加,100倍增加,你的系统架构要如何演进?这几乎是资深工程师必需要有的一个意识和能力。
其实你们能够思考一下,若是10倍增加,单表每一年新增近亿数据,还能用单库单表的方式来承载吗?
确定不行了,因此必然针对10倍增加的场景,须要引入分库分表的技术,保证每一个库每一个表分散必定的数据量,避免单表单库数据量过大。
那么你们再思考一下,若是100倍增加呢,每一年单表新增近10亿数据,你分库分表也不必定够了。由于此时可能会有高并发访问的问题,数据库抗起来很吃力。
此时,你要不要考虑数据异构、冷热分离等数据存储的架构设计?
好比采用MySQL分库分表 + 分布式NoSQL数据库 + Elasticsearch分布式搜索 + Redis缓存的架构,来总体设计这个数据存储架构。
你能够先作冷热分离的架构,好比最热的数据放入分布式NoSQL数据库,专门承载当日数据的高并发写入,以及高性能的读写。
而后每过一段时间,作数据归档,把NoSQL里再也不频繁使用的冷数据迁移到MySQL里去归档。
最后就是应对海量数据的检索,能够把索引构建在Elasticsearch里来应对,可是从NoSQL+MySQL的异构存储来提取明细数据便可。
并且针对一些特别热查询的数据,能够依托Redis作一个缓存。
其实那个P9面试官的面试评价里,指望的也是候选人把这一套架构说出来。虽然P6+的职级不必定说有能力彻底hold住这个架构,可是起码要有这个意识。
结果候选人彻底什么都说不出来,那固然会让人很失望了。
三、对公司底层技术的原理考察
这位同窗他们的系统有一部分的数据是放在特殊存储服务里的,用的是云平台上的存储服务,并且存放在存储服务里的数据仍是很核心的数据。
因此面试官就开始问第二个问题了。
面试官:你能说说你对这种特殊存储服务的理解吗,他的原理是什么?大家用的云平台上的服务存储他的架构是什么样的,大家的存储是如何规划的?
候选人 :我。。。通常是调用API往里面写数据,详细的还没太多关注过
面试官:心想:( 搞什么鬼,核心数据放这种特殊的存储服务里,结果从没关注过,起码也得了解一下他的原理,把人家的文档仔细看几遍吧 )
( 并且对于本身的存储是如何规划的,容量是否充足,他是怎么扩容的,怎么什么都不知道 )
旁白分析
这是该同窗犯的第二个错误,不说资深工程师,就说做为一个高级工程师,应该对本身负责的系统使用到的方方面面都有必定的了解。好比你要是用了语音转换API,或者是快递公司的查询API,那你起码知道人家背后大体在干什么,或者问清楚人家API的QPS极限,以及大家的访问量是多少。
大家用了特殊的存储服务,起码知道那种存储服务的实现原理是什么,存储的容量规划等等问题,这是一个高级工程师hold住本身工做的起码工做素养。
四、系统难点的考察
面试气氛尴尬,不过仍然继续。。。
面试官:那你以为大家这个系统最大的技术难点是什么?候选人 :我想一想(思索10秒后)。。。好像没什么难的,主要就是一些接口,而后数据就落入数据库了。。。
面试官心想:(这家伙难道在公司混日子?)
旁白分析
大公司面试必定会问你系统的难点是什么,这表明你的项目经验有多少含金量。哪怕大家项目很low,你硬凑平时也得想办法弄点新技术进去,没难点也要凑点儿难点出来,不然去面试必然给人鄙视。
举个例子,好比上面的这个系统,实际上他有一个步骤是要作数据迁移,也就是说把数据库里可能几百万数据量,一次性迁移到另一套存储里去
那么这个数据迁移的步骤,其实涉及到千万级的数据量迁移。
你如何保证数据迁移的效率?如何保证迁移后的数据准确性?在迁移的过程当中如何避免影响数据库的性能?
像这些问题,其实你平时都应该考虑一下,做为一个技术难点好好阐述一下吧。
五、擅长技术的考察
面试官:那你说说你认为本身最擅长最有深度的技术吧候选人 :我好像平时本身用MQ技术比较多一些
面试官:那你说说Kafka、RabbitMQ、RocketMQ几种MQ的对比,还有他们各自的原理。
它们分别如何实现分布式消息队列架构的,底层的机制都聊一下,对比一下特色以及优缺点。
候选人 心想:(。。。我要回家!)
旁白分析
大公司必定会考察你的技术深度,通常就是对你平时用的最多,或者最熟悉的技术深刻挖掘和考察,看你的技术深度有多深。结果这个同窗本身说了MQ,可是对MQ的了解实际上很是的浅薄,深刻的东西都说不出来,那么最后必定就是让面试官很无语了。
六、总结
其实这个同窗技术底子仍是不错的,包括一些技术的基础,因此前两轮面试都是过了的。可是第三轮面试考察的角度都是彻底不一样的,一会儿暴露出来了他的能力缺陷。
对本身负责系统的架构演进彻底无心识,负责系统的难点从没思考过,系统涉及的一些技术的细节不了解,没有技术深度的积累,都致使他在三面表现很很差,最后就是直接挂掉。
因此但愿你们经过这篇文章,吸收这位同窗的经验教训,平时多思考本身负责系统的技术难点,以及业务量成倍增加时架构如何演进,系统涉及到的各类技术的细节,以及积累相关技术的技术深度。
欢迎工做一到八年的Java工程师朋友们加入Java高级互联网架构:793042903获取2019最新架构进阶学习资料以及BAT面试答案,群内还会有大神在群里能够一块儿交流讨论以及资源共享。