掘金原文:https://juejin.cn/post/6998743144355348487
前言
背景
- 普通本科(非985/211),计算机科学与技术;
- 2019届,2年经验;
- 在广州一家传统中大厂从事后端研发工作;
- 本次参与的招聘为社招;
知识储备
- 我们常常说“面试造火箭,入职拧螺丝”,确实绝大多数的面试考察内容在工作中可能用不到,俗称“八股文”;
- 但往往很多深度的知识能够帮助我们在遇到更难的问题中提供必要的知识储备,提升我们的思维能力,去完善我们的知识体系;
- 知识来源可以通过高分专业书籍,博主/公众号/博客总结等,还有算法(leetcode刷起,建议100+);
- 可以通过思维导图去完善我们的知识体系,查漏补缺,总体还是非常高效的(不过也因人而异,推荐尝试下~);
- 在面试的过程中,从沟通交流,知识体系,业务思考,每一项都是对自身成长的考验和提升,每次面试后及时复盘,摆正心态,查漏补缺;
面经
Fordeal
业务:跨境电商,供应链;
结论:薪资没有谈妥,HR面挂;
一面(40min)
- 自我介绍, 项目介绍,整体服务层次,业务逻辑流转,上层业务有哪些,项目难点,怎么解决?
- Dubbo:
- 常见的dubbo filter(一时想不起来,讲了ValidationFilter, exceptionFilter);
- 自定义注入实现原理?(Dubbo SPI注入,链式调用);
- 是否可以在filter中修改默认配置?比如通信协议/序列化方式。(dubbo通过spring进行配置初始化通信协议/序列化方式,应该是不能在filter去修改的,不确定,面试官引导说可能会导致运行时异常?)
- ES:
- 业务场景使用?(多条件关联搜索+全文检索需求);
- 索引存储设计,宽表,用DB为什么无法实现?(设计思路,减少宽表冗余+避免join索引);
- DB->ES数据异构同步延时点有哪些(DB->Canal参考MySQL主备延迟,MQ投递消费,上报ES写buffer,写translog防刷盘前丢失,刷新到OS Cache,1s可见);
- 强实时性场景怎么避免时延?(走DB,ES近实时无法保障),同步处理速度多少?
- Spring:
- Spring Schedule原理(内置ScheduledExecutorService);
- MQ:
- 数据异构,重复上报问题(幂等处理);
- Java:
- YGC频繁场景(流量突增,DB getConnection慢,db连接数不稳定,无慢查询,YGC频率高,STW时间长,日志时间点符合,临时处理措施->实例扩容,增大年轻代空间,总体表述不清晰);
二面(50min)
-
自我介绍,当前薪资-对应能力维度支撑有哪些,项目中最得意的设计/模块;
-
Java:
- JVM, 配额,年轻代,老年代,堆内存;
- YGC过程(对象生产过快,gc回收过慢,年轻代-> Eden,S1,S2->老年代,分配担保,交叉GC现象,这部分没有讲好);
- GC问题排查过程(APM,告警,jstat -gcutil pid, jstat dump, mat,与服务异常时间点比对,确定堆内存大对象,产生原因,解决);
- gc dump导致应用内存雪崩怎么处理(挂载磁盘?设置dump策略,按频率阈值,收敛?说了配置printGCDetail,好像不是很满意);
- CountDownlatch , cycleBarr区别(一组多个线程同步,一组多个线程多次同步,问线程池100,countdownlatch 1000,和cyc1000,哪个能正常执行,哪个会阻塞);
- 通知机制(wait, notify)&信号量机制(没答到要点,不大记得了);
-
MySQL:
- 回表(二级索引查找->主键id->一级索引+随机IO查找完整数据);
- 如何减少回表(覆盖索引), 好处(减少回表随机IO查找),坏处(索引更新,存储成本);
- 锁,锁行还是锁索引(mysql不是数据即索引吗?有点懵),说了锁行record锁;
- explain分析,using index, using condition index区别(using index,using where直接走索引扫描,condition需要多走一次回表)
-
微服务:
- 常见微服务结构层次(说了服务节点,注册中心(服务注册与发现,更新), 网关,监控,各个组成,作用)
- 网关核心作用(讲到限流,统一流量入口,面试官提示从RPC层面-做统一的协议封装和转换, RPC过程);
- http1.1, 2区别(长连接/短连接,过程,区别;其他的想不起来了,头部信息压缩,二进制流,http请求下TCP连接复用)
-
Es:
- 倒排索引结构;(分词key,文档id为value)
- 查询优化(硬件,索引结构设计,DSL优化)
- 查询过程(queryAndFetch巴拉巴拉);
- 主分片聚合结果过大怎么处理(分页限制,单个节点就有。面试官提示主分片优先队列)。
- 分片作用(数据冗余备份,查询负载)
- 动态分片扩容(副分片直接扩容,主分片扩容过程,不可写新主分片,保证数据一致?待确定,后面看了下,主分片数不可变更,副本分片可调整,可通过集群节点扩容,主分片数据重新路由到新集群节点实现);
HR面(40min)
- 当前组织协作形式,跨部门沟通,流程;
- 部门协作做的不足的地方,怎么去推进;
- 未来发展规划,业务领域方向怎么看;
- 期望薪资;
YY
业务:YY直播;
结论:面完说部门没有hc了,帮转部门面,没有下文了,一面挂;
一面(40min)
-
项目:
- 服务排查过程(APM链路,日志->针对具体问题,慢SQL分析/网络耗时/STW->GC问题排查);
- jstack, jmap, 问了具体的几个gc排查命令,有个一直循环显示gc情况的命令,一时想不起来了,凉凉~后来查了下,jstat -gcutil pid)
- 全链路压测过程(确定业务场景,用例,预估量,部署环境,依赖屏蔽,多轮压测,发现问题,针对性解决);
- 链路传递怎么实现(大概讲了traceId通过agent注入,请求转发时在协议里带上,对业务开发无感)
- 面试官好像不是很满意,问了不同协议请求怎么埋点;
- 说抛开当前系统,自己会怎么设计(服务session传递,通过请求线程threadLocal传递)
- 面试官又问到异步线程怎么处理?说通过变量传递?他说那就需要业务编码接入了吧,不大合适(后面看了内部实现,通过agent注入+http header/ dubbo rpcContext+日志组件解析记录的方式);
-
Sentinel:
- 限流实现, 有哪些限流算法(漏桶,令牌桶);
- 如果是自己设计,要怎么做,要求简单轻量(说了单机限流,通过starter注入,自动配置限流降级规则,加载到内存,通过接口代理去做异常,耗时统计,dubbo服务还可以通过filter实现拦截,巴拉巴拉);
-
Java:
- hashMap集合结构(巴拉巴拉);
-
MySQL:
- 事务隔离级别,&默认级别(InnoDB存储引擎下RR,并且可以防止幻读);
- MVCC实现,版本链查找过程(不同的事务id,min_ids, 活跃事务id,下一个id,跟版本链事务id比较,巴拉巴拉);
- RP怎么实现(前面+ReadView视图生成)
-
Dubbo:
- 通信协议,区别,序列化方式,使用场景(讲了dubbo+hession和RMI+JDK序列化,展开);
- 问到