与阿里高级技术专家的面聊

        作为非计算机硕士毕业的应届生,当17年以java外包身份进入阿里工作的时候,我的内心充满着期待,尽管身份是非正式编制,但一直以来阿里的各种牛逼技术信息让我憧憬着一睹其芳容。一年的时间里,我尽我所能的接触各种中间件(tair、tddl、rocketmq、hsf、schedulex、diamond等等),了解其原理思想,全面的熟悉阿里的运维体系,视野得到了极大的拓宽,自认这一年我没有虚度。时至今日,于我自己可以说是收获满满。这一年的成长,除了归功于自己的努力,更得感谢主管的信任和支持,让我有机会真正深入参与及负责阿里项目;尽管部门年后大调整,仍旧帮我争取到跟这位高级技术专家面聊的机会,尝试着跟实际工作年限不太相符的职位转正。此次面聊,确实不同于之前经历过的面试,让我感觉就是更全面、更深入的技术和思维能力挖掘。正因为经历宝贵,便花了些时间将问题回忆并整理记录下来,部分题目加了一些自己的思考解答,当然答案不会很具体,更多的是思路和方向,如果需要具体问题解决办法的还需要自己另寻,不过还是希望对有需要的同行伙伴或者未来某天的自己有益吧。刚开始写文章,如有不当或者考虑不全的地方,欢迎指正。

1.项目经历具体干啥

以工作经验的先后依次简单介绍自己的工作历程,每一段的角色、突出性贡献以及自己的成长,有突出重点、逻辑性强

2.七星阵用户体验差具体定位问题

        自己在阿里做的一个项目,目前在国内阿里集团、蚂蚁和新加坡进行了部署上线,是一个应用于公司内部的数据安全产品。由于保密性要求,这里不做过多描述。相信每一个面试的人都会被详细问到自己最近做的一个项目,这个时候项目业务和技术架构、业务和技术亮点以及业务和技术不足都要思考清楚,包括日后的优化方向,这样即使考官问到也能清晰应答。

3.tomcat优化,cpu高定位解决

       这两块的优化应该是项目实践经常会碰到的问题,tomcat的优化我个人的认知应该在一下几个方面:1)初始参数如permsize、maxpermsize的设定 2)io方式如IO、NIO的切换,这个根绝业务复杂度可以调整  3)操作系统的选择  4)容器内部的优化,如最大最小线程数等。cpu高定位我觉得主要是在于问题排查的过程,个人解决流程如下:1)top命令找出使用率高的进程 2)找出进程对应使用率高的线程   3)线程打印堆栈找出有问题业务代码并解决   4)如以上流程走完没有问题,应该考虑业务能力与实际服务器配置是否匹配,当然这个一开始就应该有个考量的。

4.数据库压力大处理慢定位问题(建表不当,索引,分表,分库,读写分离,复杂业务sql)

        数据库压力大这个可能实际的情况各有差异,我仅描述自己能想到的,碰到此类问题会从以下方面排查:1)服务器配置与数据量是否匹配  2)建表是否合理,有没有应该在一个表的信息被拆分到多个表导致不必要的多次查询或者连表查询   3)sql层面有没有复杂的业务掺入,如果有是否能将复杂sql的复杂度往上剥离到业务代码层面,避免数据库的复杂运算  5)有没有结果集可以利用缓存机制的,从而降低数据库的访问量  5)单表或者单库的数据量是否过大,如果过大考虑分表或者分库,当然这会涉及到数据迁移、路由等问题,应该是在前几条处理完仍不能解决问题的情况下考虑  6)其它因素,如无用的或者恶意的请求增加服务器压力。

5.负载均衡除了挂载vip还有其它解决方案

        提到负载均衡我想我们大部分的第一反应就是LVS和Nginx等vip性质的架构方案,但被问到其它方案时,我细想好久出了一个业务层面的负载优化,也就是业务的垂直拆分,在一定程度上起到分流的作用,雷同的微服务也应该算。后来想想,zookeeper的思想也是可以被借鉴的,利用注册中心来管理域名和服务器的关联和分配,算是软负载了吧。还有能想到的就是利用DNS进行负载。遗憾的是我当时就想到了业务垂直拆分。除了以上提到的如果还有其它的思维欢迎赐教。

6.cookie与session差异,如何实现session超时失效(分布式session)

        这个问题是一个非常常见的问题,看似也挺简单,原理基本都懂,一般的大家能想到的分布式就是利用缓存,超时就用缓存失效,或者实现一个定时循环队列,不停的轮询列表处理超时session,记得当时自己也是这么回答的。后来仔细想想,这种思维是不是太单一了,现在很多的分布式开源框架中用注册中心剥离的思维不也是可以借鉴的吗,对于实时要求高的场景可以设计一个定时任务中心,由它主动对超时的session进行失效处理,既能被多方共享也能提高可用性。

7.设计模式(策略,单例,享元,装饰,代理,工厂)

        设计模式是各种开源框架和jdk里常见的,也是一种非常好的思想,能在项目中加以恰当的实用肯定是能提升bige和代码质量的,面聊中我就自己用到的集中设计模式结合项目加以描述,这个也没有什么好过多论述的,需要的话度娘里各种经典解析均有。

8.spring源码研究过哪一块(aop,ioc...)

        源码的研究是很多面试官喜欢问到的,喜欢研究源码的人特别是参与源码开发的人肯定是被加分的。可惜的是我研究的源码并不多,所以也就只能简单就aop里面的代理和实现思想进行了下分析,没研究过要想分析出其底层精华也确非易事,这个得补。

9.有没有研究过其它开源的源码,并自己用过

开放性题目,各自不同,因为我研究少也就不多说了,现在正在看dubbo...

10.你遇到过的oom有几种场景,怎么解决的

        碰到过的OOM有两种情况,一种是Tomcat实际初始配置参数不足,直接调参解决掉了,另外一种就是代码死循环,一次是本地跑出来发现的,另外一次是线上打印堆栈找到的。其它的个人没有遇到过,这里也就不强行问度娘罗列了。

11.jvm的了解程度

        这一块应该是每一个java的从业人员都必须了解和熟悉的了。内存模型、垃圾回收这两块是重中之重,我谈论的也主要是这两块,包括区域划分、性质垃圾回收全流程等。

12.分布式事务怎么处理

        事务因为在项目中用到的很少,所以准备确实不充分,当被问到时竟没有一点头绪,后来在引导下聊了几点自己的思路,但现在想想确实水了,自认离7尚有距离啊。后来针对此问题找了资料,常见的大概有以下三种方案:1)基于XA协议的两阶段提交  2)消息事务+最终一致性   3)TCC编程模式,具体实现后面再撰文分析。

13.spring事务机制

        与上题雷同处境,因为没有分析过所以对底层具体实现讲不清楚,知道有两类:1)编程式事务2)声明式事务,后者用到了AOP的思想,具体底层实现分学习中。

14.线程池影响性能的参数有哪些

1)corePoolSize线程数(根据IO和CPU的紧密程度变化)2)maximumPoolSize最大线程数 3)workQueue任务队列长度影响 4)keepAliveTime超过默认线程数的线程空闲情况下存活时间 5)线程优先级设定(根据业务类型调整)6)线程池类型  7)创建线程池的方式(ThreadPoolExecutor与Executors的差别)。其中1、2、3、4是用ThreadPoolExecutor创建线程池时用到的,1、6则是用Executors创建线程池时需要注意的,5则是创建线程时指定的。高并发量的场景,线程池不建议使用 Executors 去创建,而应该通过 ThreadPoolExecutor 的方式,这样的处理方式更加明确线程池的运行规则,规避资源耗尽的风险。

说明: Executors 返回的线程池对象的弊端如下:
a) FixedThreadPoolSingleThreadPool:
允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。
b) CachedThreadPool 和 ScheduledThreadPool:
允许的创建线程数量为 Integer.MAX_VALUE, 可能会创建大量的线程,从而导致 OOM。 

15.阿里的tddl和hsf能用开源框架自己搭吗

        阿里的中间件很多都是有开源中间件可替代,当时自己了解不多,只是分析了两者的思想和实现原理,认为有团队就可以搭建。不过了解下就发现,阿里用的基本外界都有替代品,近来在对比学习tddl和mycat、dubbo和hsf。不管怎样,能用框架解决业务是一回事,深入分析源码和思想能具备独自开发能力又是另一回事,加油学习吧!

16.一次服务端请求从按下enter开始经历那些过程,每个过程时间消耗怎么统计

        我是从网络层、业务层、数据库这个大的时序来分析的,我理解的是他问的应该不是springMVC的这种请求过程,我分析如下流程:

        域名解析-->tcp三次握手-->https校验-->vip-->Tomcat容器-->业务层-->数据库层(缓存之类)(完了返回)

        时间统计我是结合平时业务处理经验按大的范围网络层、业务层、数据库来统计,方法如下:

       网络层---->ping的方式    业务层---->日志形式(如AOP等)   数据层---->日志形式(tddl执行sql日志,还可以结合binlog日志)     

17.自己写博客吗,关注别人博客吗,关注大数据,区块链,人工智能吗

        这个问题也是触发自己着手写文章的诱因,写文章还是很有好处的,既能沉淀知识,以后需要翻起便是,还有可能会有招来橄榄枝,我一朋友就因为喜欢写技术文章被阿里的招聘同学盯上了,哈哈...

18.还有什么是你认为很擅长的没问到的

遗憾没有就自己不清楚的问题请教考官,以后没答好的一定要记得反问,就算没面过最起码也要有收获!

你可能感兴趣的:(java技术)