今天经历了工作后的第一次面试,发现自己有很多知识点没有掌握。接下来将复盘一下整个面试过程,并梳理一下后续查漏补缺的要点。

一、面试过程

  • 自我介绍

    名字、公司、工作年限、技术栈、项目职责、最近负责的重点事项、其它

  • 面试官介绍公司需要的技术要点

    高可用、云原生、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 重新作答(限定时间:两周)

根据上述要点,划分为以下几个专题:

  1. Netty请求复用实现机制浅析

  2. HashMap原理浅析

  3. 再探ReentrantLock:公平性、可重入、可中断、可轮询

  4. Eureka的自我保护机制与心跳机制浅析

  5. 分布式锁redission简介

  6. JVM内存区域简介

    之前总结过,需要继续优化与完善

  7. kubernetes体系结构简介

  8. MySql索引与B+树简介