今天经历了工作后的第一次面试,发现自己有很多知识点没有掌握。接下来将复盘一下整个面试过程,并梳理一下后续查漏补缺的要点。
一、面试过程
自我介绍
名字、公司、工作年限、技术栈、项目职责、最近负责的重点事项、其它
面试官介绍公司需要的技术要点
高可用、云原生、K8S、服务网格、流量治理、分布式数据库、分布式调度、分布式数据同步等
Prometheus的搭建方式(简历中有写Prometheus)
使用原生包搭建,未维护在k8s中。
最近做的项目的主要功能、技术要点以及难点
性能测试过程中发现高并发下“socket reset”与调用接口过慢的现象。使用okhttp替换RestTemplate原生的HttpClient和单例的RestTemplate解决问题
使用okhttp替换HttpClient的原因
HttpClient默认是短连接、okhttp默认是长连接,高并发下可以复用连接资源
(IO相关)对IO中的netty有了解吗,讲一下netty中比较重要的三个组成部分(channel、buffer),如何实现请求复用
性能测试中使用netty模拟底层服务。组成部分与请求复用方式不太清楚。
(微服务相关)使用的SpringCloud原生还是Alibaba
使用SpringCloud原生(Eureka那一套)
Eureka的自我保护机制与心跳机制
不太清楚(纯使用,没有了解底层原理)
除了使用Eureka还使用了什么
gateway、redission
(分布式锁相关)有了解过redis与redission的区别吗,redission如何解决分布式锁不靠谱的问题,红锁算法有了解过吗
不太清楚。
redission主要是用在哪个业务场景
订单加锁时的分布式锁场景
如何保证最终一致性(redisson可能会不靠谱)
定时任务判断状态
(集合相关)HashMap的数据结构(数组、链表、红黑树等)
不太清楚
(JVM相关)JVM的整体组成(内存区域)
栈、堆(其它的因为紧张没想起来)
栈的组成和使用场景
栈报错了方法的出口与局部变量表等内容,存放对象的引用。
了解栈帧吗
不太了解
有设置过JVM参数吗?如何判断这些值的范围
有设置过最大堆的最小空间与初始空间以及线程栈的空间
如何设置这些值暂时不太清楚
能讲一下K8S几个重要的组件吗?etcd了解吗?(阅读博客后)
deployment、service、pod等(这里答错了,面试官想问apiserver,这个暂时没有了解),etcd不了解
(Java锁相关)能讲一下Synchronized与ReentrantLock的区别吗?它们两个都是公平锁吗?知道ReentrantLock的可重入、可中断、可轮询相关概念吗?(阅读博客后)
Synchronized是Java原生提供的语法,Lock是jdk5后新增的语法,它们大部分场景能否通用,Lock有更强的灵活性。
ReentrantLock可以通过fair参数设置公平性,Synchronized的公平性不太清楚(不公平锁)
可重入是指一个线程可以同时持有多次锁,在递归场景经常遇到,他的重入次数与重出次数要相等时,锁才会释放。可中断与可轮询两个概念还不太清楚,
(数据库相关)了解MySql的索引吗,知道B+树吗
不太清楚。
二、要点分析
梳理一下上述问题,主要涉及到以下几个要点:
自我介绍
最近做的项目的主要功能、技术要点以及难点。并根据回答的情况针对性提问。
IO相关(如netty的原理)
集合相关(如HashMap的原理)
多线程相关(如Java锁中,Lock与Synchronized的区别、ReentrantLock的公平性、可重入、可中断、可轮询)
微服务相关(如Eureka的自我保护机制与心跳机制)
分布式相关(如redission分布式锁、最终一致性的实现方式)
JVM相关(如JVM的内存区域、栈的使用场景、栈帧的概念、JVM参数的设置与值的选择依据)
容器相关(如K8S的几个组件、以及etcd)
数据库相关(如MySql的索引与B+树)
三、查漏补缺
上述涉及到原理的部分知之甚少,这也导致了很大一部分的回答都是“不太清楚”。虽然面试官人很好一直在鼓励式提问,但还是掩盖不了自己很菜的事实。这是一次宝贵的面试经历,后面需要继续学习此次理解不够深的地方,并在后面重新作答。
如果再来一次,上面的问题能答得上来吗?
// TODO 重新作答(限定时间:两周)
根据上述要点,划分为以下几个专题: