如何介绍项目?
在介绍项目经历时讲一些项目背景是可以的,也是必要的,这样可以让面试官对项目有一个全景的认识。但这些背景知识不宜过多,因为毕竟是技术面试,面试官需要在 1 个小时左右对你的技术能力有正确的判断,所以你介绍项目经历时,最好从技术角度出发。比如,如果你做了一个社区的项目,那么项目的整体架构是一体化的还是服务化的?拆分成了哪些服务?服务之间是通过什么协议,又是怎样交互的,使用了哪些开源的组件,做组件选型时经过了哪些考虑等等,这样方便面试官在这些技术点上做一些深入的展开。
在介绍项目时,你要多突出项目中的亮点,比如,你的项目中核心系统的请求量是 10 万次/秒,数据量是百亿级别,在项目研发过程中你使用了 Linux profle 工具排查系统负载高的问题,或者使用布隆过滤器解决缓存穿透的问题的。那么你在回答时,请求量和数据量这些数据会是个亮点,这些排查问题和解决问题的方法也将是亮点。
如果没有,可以结合自己了解到的高并发的知识聊一聊,如果项目到达了某一个量级可以在架构上做哪些的改造和优化。比方说,你做一个直播的项目,平时的流量也不高,突然请到了杨幂这样的流量大咖来做直播…那么你就可以抛出这个假设,然后和面试官聊聊以下几点:
- 如何使用多级缓存应对杨幂直播间的极端热点请求;
- 几万甚至几十万人同时在直播间内发言时,要如何优化消息的延迟;
- 如何通过压测评估目前系统承载流量的能力,以便明确如何制定扩容的计划。
工作中没有高并发的项目?
老师,有个问题。一直以来很难接触到高并发的项目,做的项目也都是缝缝补补排查,基本不需要什么技巧很快就能找到问题,这样下肯定不行。老师有什么建议么?
作者回复: 其实有时候只是自己比较容易容忍问题而已。比如一些偶发的超时,重启时的慢请求,系统中有没有出现,有没有追查根本的原因。
面试官询问项目
关于项目,面试官可能问的问题:
- 使用了缓存来提升读取性能,那么这个模块的下行流量的 QPS 是多少呢?缓存命中率大概可以到多少?
- 遇到过什么问题?是怎么排查的呢?
- 有没有遇到过一些性能相关的问题?是怎么调优的?
- 针对复杂的需求你设计了哪些方案,这些方案中技术的难点是什么,你在方案设计中是如何解决的?
- 在项目中遇到了哪些疑难诡异的问题,你排查问题的思路是怎样的?
- 在项目运维过程中出现了哪些性能方面的问题,你又是怎么来优化的?
关于项目,面试官期望了解的内容:
- 项目研发的整体过程
- 你的技术方案设计思路
- 排查线上问题的能力,以及对于项目架构演进方向的把握
不了解项目的核心数据指标,也对系统的调优和疑难问题的排查知之甚少,自然不会通过面试。
面试总结
面试是双方的“博弈”,你不能被动地接受面试官的询问,而是要循循善诱,扬长避短,在介绍项目经历时,多争取主动,
把面试官引到自己擅长的领域;在平时的工作中要多关注系统的性能指标,多去参与同事排查性能问题,解决诡异 Bug 的过程,与他们讨论系统优化的思路。这些经历会成为你面试的素材,让面试官对你眼前一亮;当然你也需要多关注业界的技术发展,多思考新的技术在你的项目中有哪些应用的场景,这样也可以让面试官觉得你的技术视野比较广阔,具备独立思考的能力。
问题排查分享
针对我提到的这个问题,我也想给你分享一个之前面试的案例。这个案例涉及排查一次自研的 RPC 框架的故障,回答的思路如下:
项目中使用的 RPC 框架存在某个 Bug,偶发地出现 RPC 客户端发送给 RPC 服务节点的所有心跳包全部超时,从而让 RPC 客户端认为服务节点已经发生故障,然后 RPC 客户端就不会将流量发送给这个服务节点。由于项目中使用了 Netty3 框架,我就理了一遍 Netty3 的连接过程的代码,确认是 Boss 线程或者 NioWorker 线程某个地方阻塞了。
然后,我通过 strace(系统调用抓取工具) 抓取那段时间的系统调用,发现 BoSS 线程中涉及的系统调用全部完成了,却没有发现把 socketfd(文件句柄)注册给 NioWorker 的 selectorfd(文件句柄)的系统调用,于是确认是 NioWorker 的问题。
后来我打印了 jvm thread stack trace(Java 的线程堆栈),发现所有的 NioWorker 线程阻塞在 Object.wait,代码位置是 Class.for-Name,这样就导致所有的 NioWorker 不再处理新的 Register task(注册任务),Netty ClientBootstrap 中所有的 ConnectFuture 的状态自然不被标记,最终导致上层所有的连接超时。
再往下追查后,我发现 JDK6 中确实存在类初始化过程中出现死锁的 Bug,在升级到 JDK7 之后问题就得到解决。
你看,本来是一个偶发的 RPC 框架层的问题,而你在追查这个 Bug 的过程中涉及到了
Netty 网络编程、系统调用追踪,和多线程锁诊断等知识,面试官在听到这样的案例之后也会认可你排查问题的思路和能力。