拿到阿里offer,回馈牛客~【更新中,附上笔记】
---------------------------------手动分割线--------------------------
一、准备过程
最开始计划的是半年,但实际上花了两个月左右的时间,期间还要工作,但感觉准备的差不多了,于是就投递了简历,以下是当时列的准备计划:
要求自己写出技术博客(每周一篇)
- 1、Jvm相关,内存,类加载,调优,volatile
- 2、MQ相关,MQ架构原理,技术难点,性能
- 3、rpc相关,dubbo架构设计,技术难点
- 4、系统设计相关,秒级监控系统,秒杀系统,日志收集系统
- 5、分布式相关,容灾,熔断,异地多活,负载均衡,分布式锁,限流等遇到的一系列问题
不需要写博客,但需要复习的基础知识(实际使用时间:2月1日 - 3月5日)
- 1、多线程,线程池,线程调优
- 2、NIO,Netty,网络协议,涉及到的OS交互
- 3、SSM,hibernate工具等框架类
- 4、mysql,innodb引擎,b+树存储结构,索引,事务原理,分库分表,弹性库自动扩容原理
- 5、Redis原理,分片,主从架构设计,技术难点,工业用法,性能
- 6、ES,mongonDB,Hbase,hadoop,会使用层次即可,优缺点对比分析
- 7、Zk原理,架构设计,性能,优点,不用作注册中心理由,脑裂等常见问题
- 8、常用设计模式,结合工程深入浅出
附上当时做的计划一些截图:
每日作息计划截图:
二、谈一谈阿里面试
1、简历一定要好好写,简历我改了一个月了。以下是简历要点:
- 不会的一定一定不要写,我简历上每一个词,每一句话我都准备了三个以上的 基础问题 + 三个以上的场景题 + 一句亮点表述,这很重要(什么叫亮点表述?就是针对这个词的阐述面试官一听就觉得你牛逼,在道上)
- 简历一定要突出重点,面试官一眼扫过去心里都是卧槽,这家伙牛啊,就是我想要的人
- 写简历要换位思考,你是面试官你看到这封简历,一眼扫过去是什么感觉,找出认为不好的地方修改
- 如果时间足够,建议针对岗位写好简历,可以写上自己不会的内容,然后针对自己的简历的每一个字去准备面试
2、面试阶段,如何十分钟搞定面试官?
为啥?因为面试官已经知道你的水平了,这种简单的问题他再问就显得自己不上道了,所以,如果时间不够,不如深入的准备好几个问题。这种情况即使后面面试官的后面的升阶问题你全答不出来,那你也比那些答了一个多小时基础问题的人评价要高了,因为你们已经不在一个水位了。
三、面经放送
楼主根据上面的准备技巧,所以被问的问题其实不多,基础问题甚至基本没怎么问(写好简历真的很重要),以下是具体面经:
1、你说你熟悉多线程,说说你对线程池的理解
答:线程池入参+拒绝策略简单介绍,然后分析线程池核心线程数以及队列大小如何设置,执行过程中线程数增加和队列数增加对应用的影响,并举例压测无法打满cpu如何调整线程池参数,最后介绍如何通过重写线程池执行方法,改变线程池现存弊端。面试官表示认可,没有追问。
2、那你是怎么理解类加载的?
答:类加载器的本质其实就是通过文件操作扫描到应用classpath下的Jar包,然后读取Jar包里的class文件,经过解析,校验等等一堆乱七八糟的操作之后,再将文件里的字节码内容加载到内存里,供后面类实例化为对象使用,实例化对象的时候会根据已加载的类信息去做分配内存,初始化成员变量等等一些工作。
3、那类加载器为什么有三层结构,双亲委派是做什么的?
答:简单介绍双亲委派概念和及oot,ext,appClassLoder负责加载的作用域。然后表示双亲委派的目的其实是为了避免类的重复加载,我们也可以通过自定义类加载器去破坏双亲委派,常用于插件隔离,容器隔离等场景(这里点到为止,故意抛出等待面试官询问)。
4、那你说说怎么自定义类加载器做容器隔离?
答:先引出应用常见容器tomcat,然后介绍了容器隔离的场景,最后介绍了如何通过classCache解决隔离通信问题,这里表述比较多,校招不会问这么深入,就不展开了。至此,面试官没有再问我任何基础问题,包括我准备的锁,jvm内存模型,NIO等等一系列问题。开始怼分布式了。
5、介绍下你的项目吧。
答:此处略过问答20分钟
6、设计下缓存吧,如果数据库写成功了,但是缓存更新失败了,读到了脏数据怎么办?
答:写库前先更新缓存,使缓存失效,缓存失效后再更新数据库,数据库异步同步缓存,同时将状态更新为有效。
7、那同时来了两个更新请求,同时失效掉缓存,然后第一个请求导致数据更新了,并将缓存状态置为有效,此时第二个请求更新数据库后,还未更新缓存此时系统挂了。数据库与缓存数据不一致导致读取脏数据怎么办?
答:数据库字段加版本号,缓存value中也加版本号,每次更新数据库时版本号+1,然后异步同步数据到缓存,并将缓存版本+1,读取缓存时对比缓存中的两个版本号,如果一致则返回,不一致则读库。面试官不再追问分布式相关问题,开始问系统分析和架构设计。
8、你如何保证系统的稳定性?
答:分布式的链路一般都很长,所以我们首先通过全链路压测,分析整个链路,到底是哪个节点出现瓶颈。如果是数据层出现瓶颈,那么可以考虑加缓存,读写分离等降低数据库压力,如果短期流量很大,一天就能打满一个库,那么要考虑扩库。数据层如果没问题,瓶颈在应用层,那么需要先分析应用代码是否有问题,jvm是否可调优,线程池是否可调优,rpc超时时间设置是否正确,如果应用代码没问题,那么可以加docker,进行水平扩容。如果问题不在己方链路,在于依赖服务,那么要推进对方进行性能优化,并且最好降级预案。如果系统已经最优,无法进行优化仍然承受不了流量,那么只能做限流处理了。然后又介绍了一些流量隔离等等业内解决方案。
以上为主线问题,附上一些其他问题:
- 注解怎么实现
- 秒杀系统怎么解决超卖问题,还有其他实现方式吗
- redis分布式锁怎么实现,和zk实现的区别
- rpc一次请求过程,从序列化,压缩,线程池讲讲,越细越好
- mq顺序消费如何做
- mq可靠交付如何保证
- gc问题排查,cpu过高如何排查
- es倒排索引介绍下,range和filter的区别,查询性能飘高怎么解决
- es字段设计有什么要点,和数据库对比下
四、再次总结面试
二面三面一直到HR都很顺利,面试官也都很Nice,就先写到这了,看的人多就再写吧。希望大家能通过我的面试经验,发现面试官想要的到底是什么,然后做针对性的准备,不要白白花了时间,却达不到预期效果。其实就是我之前说的,面试官觉得你会了,就不会再问你同等基础问题了,如果问了你一小时基础,那么你就要当心了,可能要凉。
五、写在最后