掘金原文:https://juejin.cn/post/6998743144355348487
前言
背景
- 普通本科(非985/211),计算机科学与技术;
- 2019届,2年经验;
- 在广州一家传统中大厂从事后端研发工作;
- 本次参与的招聘为社招;
- 我们常常说“面试造火箭,入职拧螺丝”,确实绝大多数的面试考察内容在工作中可能用不到,俗称“八股文”;
- 但往往很多深度的知识能够帮助我们在遇到更难的问题中提供必要的知识储备,提升我们的思维能力,去完善我们的知识体系;
- 知识来源可以通过高分专业书籍,博主/公众号/博客总结等,还有算法(leetcode刷起,建议100+);
- 可以通过思维导图去完善我们的知识体系,查漏补缺,总体还是非常高效的(不过也因人而异,推荐尝试下~);
文章图片
- 在面试的过程中,从沟通交流,知识体系,业务思考,每一项都是对自身成长的考验和提升,每次面试后及时复盘,摆正心态,查漏补缺;
结论:薪资没有谈妥,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时间长,日志时间点符合,临时处理措施->实例扩容,增大年轻代空间,总体表述不清晰);
- 自我介绍,当前薪资-对应能力维度支撑有哪些,项目中最得意的设计/模块;
- 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巴拉巴拉);
- 主分片聚合结果过大怎么处理(分页限制,单个节点就有。面试官提示主分片优先队列)。
- 分片作用(数据冗余备份,查询负载)
- 动态分片扩容(副分片直接扩容,主分片扩容过程,不可写新主分片,保证数据一致?待确定,后面看了下,主分片数不可变更,副本分片可调整,可通过集群节点扩容,主分片数据重新路由到新集群节点实现);
- 当前组织协作形式,跨部门沟通,流程;
- 部门协作做的不足的地方,怎么去推进;
- 未来发展规划,业务领域方向怎么看;
- 期望薪资;
结论:面完说部门没有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序列化,展开);
- 问到protofer实现跟hession有什么不同吗(不懂);
- 网络协议层面怎么去实现负载均衡(不清楚是想问啥,协议是网络通信交换,跟负载均衡关联不起来。。。)
- Spring:
- 事务传递,生产中怎么使用(Spring事务传递使用);
- 同步线程能否读到事务中写入变量(当前事务可以),异步线程呢(猜想不可以,需要等事务线程提交后才可见);
- Redis
- 数据结构(讲了string, list, hash, set, zset)
- HA,Sentinel,讲一下故障发现和转移过程(巴拉巴拉);
- 怎么去发现新加入节点的redis节点(当时没想起来:Sentinel模式下可以通过集群通信发现新节点,cluster模式下可以通过槽指派);
- redis pipeline有用过吗,讲一下(没有)
- 逻辑:
- 电话记录本,内容非常多,怎么实现统计相同电话号码记录次数,和top N记录(HashMap-key为电话号码,value为出现次数++,topN通过队列插入单独存,,,,应该是可以用有序map去存的,当时没想起来。。。)
- 内存不够放怎么办?说了分组统计,比如两两对比去分而治之,面试官没有继续追问了,现在看来应该是不行的)
- 电话记录本,内容非常多,怎么实现统计相同电话号码记录次数,和top N记录(HashMap-key为电话号码,value为出现次数++,topN通过队列插入单独存,,,,应该是可以用有序map去存的,当时没想起来。。。)
结论:拿到offer;
一面(83min)
- Java:
- 集合,ArrayList,LinkedList(区别,使用场景),HashMap结构,头插尾插区别(hash冲突链条冲突节点加入方式),解决什么问题(并发时死循环),红黑树转换条件(数组长度>64 && 链表长度>8),查询时间复杂度(logN);
- 并发,CorrentHashMap结构,分段锁实现Lock,Synchronized关键字实现&区别(java类库实现,JVM层面实现,Lock手动加解锁,代码块,Synchronized可在代码块,方法加锁,区别,实现原理,acc_synchnorized,锁对象头monitor enter, exit);
- CAS频繁会有什么问题(cpu飙高->走锁升级),讲一下锁升级过程(偏向锁-轻量级锁-自旋-重量级锁);
- Java线程池(worker,boss线程),工作原理,各个阶段线程数的变化(核心线程数-队列-最大线程数-拒绝策略);
- JVM内存模型,各个区域的作用,堆,堆内存放数据是什么(《深入理解JVM虚拟机》都有讲到);
- 垃圾回收过程,算法,会导致什么问题(标记清除-内存碎片,提前GC),分代回收对应算法,GCRoot过程,有哪些对象关联,怎样判断一个对象可以被回收(对象无引用,GCroot不可达);
- CMS,优势(并发,STW时间短),垃圾回收过程,STW阶段(初始标记,最终标记),弊端(CPU资源敏感,标记清除导致浮动垃圾);
- Redis:
- 加锁场景,过程,使用命令,讲了get,setnx+expiretime,del,原子性实现(说到lua合并命令,面试官说前期版本是,后期不是了,官方提供了原子指令级实现);
- setnx含义(nx忘记了,面试官引导if not Exist,问没有原子性会导致什么问题)
- 场景题:t1执行时间长,达到过期时间,被其他锁获取,破坏竞态条件怎么解决(说了锁续期,redission看门狗实现,t1耗时无法估计,什么时候做锁续期?只能瞎猜说异步线程计时器,过期时间之前进行续期,按一定策略去终止续期动作;面试官引导在加解锁的时候,key为锁变量,value为uuid或是版本号值,删除时做判断是否为当前线程持有锁,避免其他线程删除);
- Redis的并发安全问题是否有考虑(瞎说了加锁?面试官提示性能问题,引导Redis单线程模型,讲了单个事件队列,不存在竞态条件)
- 网络协议:
- http, tcp层次,关系(应用层,传输层,网络包逐层包装交付);
- tcp,udp区别,tcp三次握手,四次挥手过程;三次挥手有什么问题,四次挥手过程客户端和服务端分别处于什么状态(close_wait和time_wait说反了。。);
- 为什么服务端发起fin后,客户端ack后是否直接close,说了2个MSL时间,问为什么需要这样设计(确保网络阻塞时服务端ack重发确认),RTT是什么;
- tcp粘包问题,为什么会发生粘包(连续字节流传输,无边界),拆包发生在哪一层(应用层协议);
- 滑动窗口过程,拥塞控制实现方式(慢开始,问怎么确定当前提升速率,说到往返包时间确认;怎么确认,发送端计时器,统计,面试官好像不大满意~,后面的拥塞控制算法细节一时想不起来了。。);
- MySQL:
- 索引结构(数据页,叶子结点,非叶子结点,有序性,页内数据);
- B+树(为什么不是B树,讲了B树非叶子结点数据存储,树高问题);
- 常见的SQL优化(讲到索引,覆盖索引,索引有序性,最左匹配,explain),回表过程是什么(二级索引+一级索引),怎么优化(select+覆盖索引);
- 业务分库分表场景,问题点,跨表查询问题,是否有用过读写分离,主从结构(答了从库只是做备份,避免主从延迟问题);
- ES:
- 讲一下ES,倒排索引,分片结构,为什么快(key为分词,value为文档id,分布式存储,查询负载,扩容灵活);
- 搜索过程(客户端,请求,协调节点,转发,本地查询,返回);
- 查询优化方式(业务单索引设计,字段类型设计,主副分片配置,冗余备份+查询负载,DSL优化,评分/非评分查询,业务查询数量限制);
- 遇到什么性能瓶颈(单个索引数据量不大,做业务索引区分,暂无);
- MQ:
- 使用场景,服务解耦,削峰;
- MySQL:
- 索引,有序性,失效场景,常见优化方式(索引结构,顺序查找,合理建立和使用索引,explain分析);
- 场景题:学生表-学号,身高,体重三列,查询身高大于1米7,并且按体重排序,怎么做;
- Redis:
- 加解锁过程;(check判断是否为当前线程持有,尝试加锁setNx+Ex, 结束后del锁)
- 线程超时后锁释放被其他线程获取怎么办(可以通过线程id加入到key,加锁时判断,确保过期后不被其他线程获取造成业务操作异常/守护线程提前续期);
- 全链路压测:
- 实施过程,怎么提升服务指标;
- 异步化的场景是怎样的;(非同步消息推送,可以通过异步线程/MQ)
- 压测有考虑DB数据量写入大小吗(保持与生产集群数据量一致,依据场景用例,业务层面通过查询维度过滤,暂无;对于流水数据查询做了日期水平分表);
- Sentinel:
- 实现原理;(Entry入口,Slot链构建,限流降级链条调用);
- 有哪些限流降级方式(RT,异常数,耗时数),限流/统计算法;
- 滑动窗口,时间窗怎么实现;
- 项目:
- 设计过程;
- 考量哪些维度(调研,需求分析,得到业务元素,尽可能每个模块解耦提升灵活性)
- 设计模式使用,策略模式场景,过程是怎样的;
- 如果项目中有多个if嵌套,可以怎样优化(答了责任链模式,每次处理完之后传递给下一个节点)
- 算法:
- 只出现一次的数
- 讲了通过Map(num, count)存,统计,面试官说那不用额外空间怎么做,异或,没想起来;
- LRU
- 讲了访问链表,LRU链表;更新,插入时更新LRU链表头部,删除移除,最少使用挤出淘汰,讲的不清楚~;
- 面试官问怎样在LRU链表查找指定节点,说了链表不支持随机访问,只能遍历,或通过额外hash数组做索引访问,数组值指向LRU链表节点,好像面试官没说啥,但好像不大满意。。。;
- 讲了访问链表,LRU链表;更新,插入时更新LRU链表头部,删除移除,最少使用挤出淘汰,讲的不清楚~;
- 算术运算,给定一个合法的计算式,计算结果
- 讲了通过栈结构,算式拆解入栈,数字直接入栈,遇到匹配括号出栈,运算结果后入栈,直到结束;
- 图查找最大价值,路径为权重,节点为值,求路径最大价值,不能同时分叉多个节点-其实是树;
- 讲了动态规划,定义最大路径价值dp[node],通过DFS遍历,获取一个路径A的最大价值,再遍历B路径,更新MaxValue值,后面想用第二维去存储累计值,不大清楚~
- 只出现一次的数
- 项目:
- 假设了一部分场景,问怎么实现,考察项目扩展性,数据一致性实现(非常深入,暂不展开);
- 自我介绍,项目情况;
- 沟通协作;
- 薪资,工作地点确认;
结论:过了一面后比较忙,拒了;
一面(30min)
- NIO:
- 讲一下NIO,零拷贝实现原理,优势,会有什么问题(文件IO/调用IO,阻塞/非阻塞,同步/异步,通过网络调用讲零拷贝实现过程);
- Dubbo:
- 服务注册发现(讲了整体结构,包括注册中心的服务注册发现,zk监听机制实现,服务生产与消费);
- 调用过程(服务发现,调用,序列化,方法包装,链式调用,invoke,处理,逐层返回,反序列化);
- 多个提供者场景怎么去调用(讲了四种负载均衡策略,场景,容错处理,追问了一致性hash,还有实现);
- Zookeeper:
- 使用场景(讲了注册中心和锁)
- 节点数据结构(文件树),类型(临时,持久化,顺序节点搭配)
- 选举过程(zk的不是很熟悉,参考Redis的主从&哨兵选举过程类比了下)
- 脑裂问题怎么处理(trxId对比);
- MySQL:
- 场景:查询,select 列,where条件列在和不在索引列分别的查询过程(不在索引列多了回表过程);
- 索引数据结构,回表,解决,随机/顺序IO问题;
- Java:
- JVM,常见的垃圾收集算法,特点,使用场景,过程;
- CMS垃圾回收过程,不同阶段做了什么(初始标记,并发标记,重新标记,并法清除),STW,GC/用户线程在不同阶段的执行情况;
(过了10min hr小姐姐打电话约下一轮,刚好工作上又来了个大需求,也有其他大厂面试,顶不住,拒了)
结论:拿到offer;
一面 (30min)
- 全链路压测:
- 流程(讲了压测场景,用例梳理,指标确认,压测环境搭建,样本,异常/耗时比例,APM链路排查耗时点);
- 如何保证SLA三个9,统计维度有哪些(服务不可用时间,异常失败,耗时比例,自动采集统计);
- 熔断限流:
- 指标(讲了异常数,耗时数,比例统计);
- 熔断措施(返回null,抛异常,设置熔断时长拒绝,到时自动恢复);
- 讲一下服务雪崩(讲了微服务间调用,链路上下游,一个节点异常,拖垮正常节点,同时服务会有容错处理,比如重试,可能加剧请求压力,最终一个影响多个正常服务奔溃)
- MySQL:
- 查询优化,联合索引,减少回表等(巴拉巴拉);
- 给定A,B, A+B字段查询,如何建索引(A_B_index, B_index,第一个通过联合索引覆盖,第二个直接走B单列索引)
- 分库分表:给定一个5亿订单表,查询总数;(按日期,获取每个订单分表count大小,汇总统计,看业务场景,这里不大行;讲了通过订单id hash,设定分表步长统计,面试官没有继续问。。。)
- 缓存:
- 数据结构,缓存&DB一致性保证(讲了旁路缓存模式,缓存查询,更新流程,最终一致性,完全强一致性则加锁保证)
- 面试官认为场景比较简单,好像不大满意,期望复杂对象缓存和强一致性有所应用;
- 数据结构,缓存&DB一致性保证(讲了旁路缓存模式,缓存查询,更新流程,最终一致性,完全强一致性则加锁保证)
- 问题排查:
- CPU飙高问题排查(top, top -Hp pid, jstack -l tid)
- 线程堆栈分析场景(代码死锁,循环等);
- 介绍认为设计的比较不错的项目/模块;
- 讲了xx服务,基于什么考虑去开发(数据量,上层业务困扰,平台层面分析,调研,开发,推动,业务接入);
- ES:
- 选型(跟MySQL对比,讲了业务需求,场景,ES分词特性,搜索性能,社区活跃度,运维亲和性等维度)
- 优化方式(运维层面:多分片副本,查询负载和存储冗余;索引层面:索引模板设计;查询层面:DSL优化);
- 出现毛刺现象怎么解决,ES数据量,集群配置等;
- Canal:
- 同步流程,同步链路可靠性怎么保证(Canal监控+服务定时调度监控,消息堆积自动扩容,拉取批次参数动态调整,消息ack/rollback保障);
- 为什么通过MQ削峰(讲了大数据量变更同步场景,利用MQ做堆积可靠性保证,削峰减少服务同步压力),服务对外异常怎么处理(通过服务层面自定义异常,业务处理)
- 其他:
- 年限/平台看法,团队项目,协作情况沟通,对方业务介绍,加班怎么看等;
- 项目:
- 讲一下项目的整体流程,设计,选型,思考过程;
- Es查询和同步是怎么实现的(queryAndFetch过程,分词存储,倒排索引);
- 项目开发过程中,怎么主导,涉及业务方,内部,外部,需求,方案,评审,沟通,协调,风险,进度把控去怎么做;
- Spring:
- IOC实现过程(巴拉巴拉讲了一遍之后,面试官说可以再讲细节一点:包括到延迟加载判断,循环依赖过程一步步。。细致的流程没串起来)
- 平常怎么使用spring的(讲了ServiceBean,自定义组件封装,自动配置starter,springMvc相关,jdbc层抽象封装,扩展);
- Redis:
- 选型,使用场景(锁/缓存),业务redis加解锁过程(get, check, setex, delete);
- 任务执行时锁被其他线程抢占怎么处理(通过value值判断锁是否为当前线程持有);
- 任务执行超过过期时间怎么处理(建立当前线程的守护线程+锁提前续期+线程任务结束释放);
- MySQL:
- 索引树结构(B+树展开);
- 耗时排查过程(APM定位, explain分析);
- HA怎么做的(主备);
结论:一面挂;
一面(70min)
- Java
- 线程池,核心参数,变化过程,有没有办法先走最大线程再走队列(没想到,后面了解到Dubbo线程池是这种实现,对于RPC调用,IO密集型,优先分配资源处理任务);
- 面试官问说有什么好处,JDK线程池跟他这种,说到任务类型,IO,CPU密集,资源占用,好像不满意),场景,阻塞队列;
- GC, cms,垃圾回收过程,stw阶段,初始和重新标记为什么需要stw(增量垃圾标记);
- ClassNotFoundException和ClassNotDefException区别,什么场景发生(编译时/运行时类加载查找,);
- Java进程占用高问题排查(常用命令使用);
- Mybatis
- Mapper接口怎么实现查询(讲了xml绑定代理),追问是静态还是动态代理实现;
- Spring
- 循环依赖怎么解决(三级缓存,过程)
- MySQL
- 索引类型,覆盖索引,场景(讲了查询过程,二级+聚簇,减少随机IO);
- 隔离级别实现(MVCC);
- 间隙锁,为了处理什么问题,什么时候会加上, select * from table for update会加吗;
- 给一条sql: select * from table where a=‘x’ and b=‘x’ and c!=‘x’ order by d limit 0, 10 怎么加索引;
- 网络:
- http常见状态码,301,302请求转发地址放在报文哪个部分,cookie呢;(都答的http header);
- https原理,加密过程(RSA握手,应用层,传输层之间,SSL加密,客户端,服务端,CA证书校验);有了解哪些加密算法吗;
- Redis
- 淘汰策略(random, Lru *2, abord);
- 删除策略(定时,惰性,定期);
- 算法
- 二叉树序列化&反序列化;(先问了思路,评估下再让你写:一开始通过树迭代#换层,*记录null节点,树节点拉满,后面对于null处理有困难;使用序列化前序,中序节点,再反序列化建树;没写好)
- https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree/
结论:已拿offer;
一面(42min)
- 项目:(怼了很多细节)
- 参与的项目中,在团队中的角色,负责项,背景;
- 讲一下项目中的难点;
- 服务吞吐量多少,同步瓶颈在哪,怎么解决的;
- 搜索引擎选型,DB数据同步选型(业务场景,特性,社区活跃性,运维亲和性),问是运维团队还是自己部署的(Canal服务端,Es运维部署,客户端+DTS自己实现);
- 工作中的优缺点,怎么去处理;
- Java
- Synchronized使用场景,原理(竞态变量同步,锁代码块,方法,monitor);
- volatile作用,实现原理(从可见性实现和原子);
- Java反射实现(反射方式,类检查,加载过程);
- JVM运行时区域,具体作用(常见八股文~);
- FGC怎么发生的(YGC晋升老年代空间不足,分配担保空间不足,System.gc等);
- system.gc一定会出发fgc吗(不一定,只是通知jvm);
- MySQL
- 存储结构(讲了熟悉的InnoDB引擎,索引B+树)
- 为什么使用B+树?(树高问题,目录项节点存储更多关联孩子节点,双向链表范围查询,按页加载减少磁盘IO);
- 事务,隔离级别,实现原理(MVCC, undoLog,版本链查找过程);
- Canal
- 工作原理(模拟Mysql slave交互协议,binlog主从同步,数据解析)
- 底层架构(不清楚)
- 设计模式
- 熟悉的设计模式讲一下(模版方法),业务使用场景讲一下;
- 项目
- 项目设计流程,角色,相关方,难点,怎么解决,领域知识怎么解决(项目一个个过了一遍);
- 用到哪些设计模式,场景(讲了模版方法模式);
- 平常学习哪些技术,源码(讲了MQ跟ES,没继续深问。。。)
- Dubbo
- 服务,A->B,并发调用(讲了调用线程池)
- 超时熔断机制怎么实现(猜想,说讲了守护线程+计数器+容错机制),提示用并发包相关类(凉凉,不清楚,查了下是Future和Condition类);
- 项目
- 自我介绍;
- 挑一个认为最有挑战和成长的项目,业务内容存储结构/解析是怎样实现的;
- 服务调用量,资源配置,实例数;
- 当前就职公司规模,业务,研发比例;
- Es
- 存储结构(倒排索引),分词器,语言/引擎实现(Java+lucene);
- 实现查找原理(请求发起,协调节点,路由,节点查询负载,分片冗余),ES分片,结构,是否为完整数据;
- 怎么持久化的(内存buffer->transLog->OS Cache->Disk);
- 内存热点数据保持(淘汰策略);
- 如果数据分布在不同机器节点,怎么确保查询到指定节点(文档id路由),如果是根据关键字,一开始没有文档id怎么路由;
- 怎么获取分词器分词结果(_analyze),如果分词结果不符合预期,怎么去调整,比如地址[浙江]被拆分为[浙][江])
- 工程化编码题;
- 自我介绍;
- 项目介绍,承担的角色,负责模块是什么,上下游;
- 说一下你的优势,擅长的点;
- 参与开发的产品优势,亮点有哪些,业务方角色有哪些;
- 业务竞品有哪些,特点,差异,怎么去追赶;
- 工作2年来遇到的困难是什么,怎么解决的,有什么收获;
- 项目/业务创新方面是否有实践;
- 你的性格怎样;
- 政策监管怎么看,是否影响业务发展,怎么去提升;
- 当前&期望薪资,是否有其他offer选择,对要去的部门有什么了解;
结论:HR流程终止;
一面(55min)
- 项目
- 自我介绍,认为比较有挑战性的项目,有什么问题,怎么解决的,方案设计;
- Canal
- 监听需要MySQL配置是怎样的(不大记得了,,瞎说了个Compact行格式?说忘记了。后面看了下,是开启binlog+ROW模式);
- DTS同步一致性,延时处理措施,TPS多少,怎样去提升;
- Es
- 集群,怎么做节点扩容(告警+分片扩容);
- MySQL:
- ACID特性是怎样实现的(ACID含义,事务隔离不干扰,MVCC, 日志+刷盘持久化)
- 常见的MySQL日志有哪些(undo log, redo log, binlog)
- undo log作用(事务回滚撤销,MVCC,RollPointer指针引用)
- redo log作用(顺序写入,持久化,减少16kb数据整页刷盘IO)
- 插入一条数据是怎样写log的(SQL->BufferPool->undo log->redo log -> 事务提交->binlog ->redoLog commit);
- 存储引擎索引结构(B+树结构,多路查找,叶子结点数据),时间复杂度多少(二分logN);
- B树结构,为什么不用(数据非叶子结点,树高底,内存页与磁盘页交换效率高);
- 锁类型,幻读是什么(T1多次查询,T2插入数据,导致T1结果集数量变多),怎么解决的(RecordLock, GapLock, NextKey-Lock);
- Redis:
- 数据结构(常见5种,string, list, set, zset, hash),还有呢(bloomFilter, Geo),业务使用场景;
- Java:
- Synchronized实现原理(对象头,Monitor对象,代码块:monitor enter, exit, 方法:acc_synchronized,隐式monitor);
- 线程池ForkingJoin有没有了解过(不熟悉,生产中没用到,没继续问);
- 当前用的JDK版本(8),相对于7有什么新特性(集合流式操作,lambda表达式,增强函数式编程);
- Spring:
- Spring-boot启动原理,spring.factories作用(key-value, 自动配置加载查找,注入bean);
- 一个API要实现DB数据插入后,三方调用失败,数据回滚,怎么实现(加入到同一个Spring事务中,@Transactional)
- 讲一下Spring事务传播行为(讲了Requied, SUPPORT, NESTED三种,还有个无事务时抛出异常,英文记不住名字。。。后来查了下:MANDATORY)
- 算法:
- 整型无序数组,查找第2大的数(一开始无脑两层for比较……面试官要求一层且效率尽可能高,最后采用类似动归降维,定义最大两个数int num1, int num2, 一层for循环比较,维护num1, num2, 返回num2);
- 项目:
- 自我介绍+项目介绍,难点,角色,事情,你在里面做什么;
- Es:
- 选型,跟solr, lucene对比,相同和不同点,出现问题一般是运维还是开发处理;
- Es架构,讲了存储结构(倒排索引),分布式,冗余+查询(主副分片设计,查询路由,分片);
- 有没有出现性能问题(DSL慢查询,同一集群其他业务资源占用),怎么处理(DSL优化,按优先级迁移部分业务),性能问题的根因是什么(CPU,内存占用,磁盘交换IO等);
- ES节点扩容怎么做(印象中好像不能修改主分片数,说猜想增加节点,重新hash分片,路由迁移数据),是否会导致停机(不会),集群迁移有没有处理过,怎么实现;
- ES跟MySQL怎么配合,选型区别,是否可以只有ES不使用MySQL(关系型数据库,非关系型数据库,看业务场景(比如分词搜索,数据量,查询需求),存储需求, 一般是结合使用DB+ES);
- RocketMQ:
- 使用场景(服务解耦,削峰);
- 组件组成结构(producer+comsumer+nameServer+broker), 不同结构之间怎么实现通信的(nameServer->broker心跳,producer与nameServer进行broker发现,消息负载到broker端,comsumer消费)。
- 10个broker20个消费者,10个broker5个消费者分别是怎么消费的(broker锁,消费负载);
- 顺序消费实现原理(消息生产端队列路由,存储端FIFO,消费端加broker,queue锁消费),源码是否有读过;
- 场景:
- 支付-》订单(RPC)调用如何保证数据一致性,不考虑时延,调用时请求丢失场景怎么去检查和恢复(说了异步调用+轮询检查订单完成结果,或是订单完成后通知支付端,调用方重试等),面试官说有些复杂,最后说了个直接阻塞调用获取结果。。。
- 业务最终一致性实现,落地场景(讲了DTS中利用MQ可靠消费+重试实现),2pc, 3pc,tcc的场景;
- 订单ID生成器设计(业务含义,划分ID段,一部分可以使用雪花算法去生成唯一id,中间段加订单日期类业务号,性能角度,可以使用发号器一次性分配号段,减少频繁生成请求);
- 雪花算法实现有了解吗(说了分配为几个段,机房唯一id,后面的组成细节不记得了)
- 其他:
- 平常学习情况,最近学了哪些,性格怎样,项目难度,怎么去做业务沟通,相关方有哪些等;
- 项目:
- 项目介绍,领域划分和设计依据,难点,怎么解决,做了什么优化,结构层次,依赖组件原理,问的比较深入;
- DB->ES数据异构一致性和延时问题,分别怎么解决;
- ES:
- 优化(硬件配置,业务索引设计,DSL优化三个角度展开);
- 分片存储(备份HA+查询负载);
- 大量写入/查询会导致什么问题,怎么解决(定时刷transLog,磁盘,做集群/分片负载);
- Segment文件刷盘频繁怎么解决;
- MQ:
- 顺序消费实现原理(生产端,存储端,消费端),源码实现;
- 消息存储结构&功能(CommitLog, ComsumerQueue,IndexFile);
- MQ事务消息实现原理(实现过程,半事务消息流转);
- Java:
- 锁类型(Synchronized->JVM层面,Lock->AQS实现,展开);
- 为什么ReentrantLock需要支持可重入,实现原理(再次获取竞态资源,同一线程安全,AQS State++—判断);
- CMS跟G1, 异同点,生产实践选择;
- 项目:
- 介绍,难点,怎么解决;
- 英文沟通能力怎样;
- 资金安全场景;
- ES:
- 搜索引擎选型,深分页场景优化,Scoll游标原理,日期范围查询;
- DB->ES数据异构,一致性/延时处理,消息堆积优化策略,消息优先级判断;
- 同步异常处理,容错(消费阻塞,监控+存储业务id到Redis定时重试);
- MQ:
- 可靠消费&Ack, rollback机制(ComsumeQueue消费位点确认);
- broker宕机,数据一致性怎么保障(主从broker同步,异步方式,写log);
- 缓存:
- 击穿,穿透,雪崩场景,怎么解决(常见八股文~);
- Canal:
- 同步优化,自定义客户端MQ投递实现;
- 时间沟通问题,放弃流程;
结论:一面挂;
一面(85min)
- 算法:
- 三数之和: https://leetcode-cn.com/problems/3sum/
- 项目:
- 架构,ES数据异构怎么做的,同步速度,延迟;
- java:
- JMM内存模型(当时讲成了JVM内存模型,,有些尴尬);
- 线程池场景,模型,核心参数,涉及数据结构,原理,等待结构怎么实现的(问的比较细~);
- Synchronized和Lock实现原理,区别,使用场景(常见八股文~);
- CS基础:
- 操作系统用户态和内核态,区别(概念~);
- 零拷贝原理,常见实现(mmap,sendFile,列举了用户数据变更-CPU拷贝-DMA操作-缓冲区-网卡,过程);
- Redis:
- 数据结构;
- Cluster集群实现,槽指派,新节点加入如何分配(槽指派,重新分配节点过程);
- 渐进式hash迁移过程(H0,H1);
- bloom过滤器实现(bit数组,多次hash函数);
- MySQL:
- 分库分表(拆分依据,时间/id),实践(代理式/应用层两种,对应中间件);
- 常见MySQL锁,场景(X/S锁,record/表锁,IS/IX锁,GapLock);
- 隔离级别,MVCC实现(常见八股文~);
- 面试是一场场对自己技术体系,知识储备,思考沟通,应变能力等等多方面的考验,过程中确实会遇到很多的困难,及时总结,不断改进,可以的;
- 找到自己的目标,不断地赋予自己前行的动力;
【冲|2年CRUD|社招|后端开发|上岸面试分享(附面经)】在有限的青春里,做有意义的事,做让自己成长的事,对未来有价值的事-空白女侠
山脚拥挤,我们高处见。
推荐阅读
- java|大厂如何决定裁掉谁()
- 面试|接口测试题目总结
- 面试题|简述数据库三大范式
- java|绝了,竞标降薪!
- #yyds干货盘点# 大厂面试Java内功深厚()
- 「2022」打算跳槽的,必知的 WEB 安全面试题
- 「2022」打算跳槽涨薪,必问面试题及答案 -- vue3 篇
- 算法|软件架构师成长之路: Master Plan for becoming a Software Architect
- 一道面试题目