一面
1. 做1分钟左右的自我介绍。
2. HashMap底层的数据结构是什么样的?
3. 使用Map写入key的时候,如果出现哈希冲突,会怎么处理?
4. 说一说synchronized和ReentrantLock这两种锁的区别?
5. JVM的内存区域分为哪些部分?new创建的对象存放在哪里?静态对象存放位置呢?
6. Spring Bean默认采用单例模式,如果多个线程同时调用这个Bean,会不会产生线程安全问题?
7. 项目数据库使用的是什么?了解MySQL中InnoDB引擎和MyISAM引擎的差别吗?
8. 在项目开发中Redis一般用来实现哪些功能?
9. 有没有做过SQL优化?拿到一条慢SQL,你的分析思路是什么?explain命令输出的各项指标代表什么?通常type字段优化到哪个级别比较合适?
10. ACID代表什么含义?
11. 你的项目里使用医保编码精准匹配,再加上名称、规格、厂家加权打分的两段式算法,为什么不能只依靠药品名称做匹配?
12. 项目通过EasyExcel读取、解析并校验十万级别的数据,这批数据是怎么完成导入的?能否一次性全部加载进内存?
13. 你的项目用到了EhCache本地缓存,为什么没有全部使用Redis?EhCache和Redis有什么区别?可以把Redis理解成服务端缓存,EhCache属于JVM本地缓存。
14. AI相关项目为什么同时选用RabbitMQ、Redis、MySQL三种组件,是出于哪些方面的考量?
15. Redis是否可以用来实现消息队列?
16. 耗时工具会阻塞对话主流程,所以项目设计了异步架构和Agent路由机制,为什么这类耗时任务不能直接在Agent主链路里执行?
17. 在项目开发期间,你遇到最难定位的bug是什么?最后是如何排查解决的?
18. 如果入职我们这边,分配一个你完全不熟悉的项目,你会怎么上手学习?
19. MySQL索引在哪些场景下会失效?你提到了联合索引的最左前缀原则。
20. 查询条件顺序为a、b、c,如果查询条件改成b、a、c,这条SQL还能走索引吗,会不会索引失效?底层MySQL优化器会自动调整字段顺序。
二面
1. 自我介绍。
2. 项目实现药品库存和省级采集目录自动匹配功能,这份省级采集目录的数据来源是什么?
3. 依靠哪些字段完成数据匹配?
4. 十万行Excel数据导入是一次性提交还是分批次处理?每一批次处理多少条数据?
5. 导入任务一共1000条数据,执行到第900条发生报错,前面已经处理的900条数据是入库成功还是全部回滚?
6. 如果用户上传两份完全相同的Excel文件,如何识别重复?具体检测方案是什么?是否每一行导入都要查询数据库校验重复?
7. 如果仅这样处理,只能识别同批次1000条内重复,无法对十万条历史数据做全局去重,该如何解决?
8. 如果采用上面的方案,会存在内存占用过高,Hash集合无法及时释放的问题,每次都新建HashSet怎么优化?
9. 那是否可以把去重数据放到Redis?对应的key和value该如何设计?
10. EhCache缓存里面存放的是什么内容?系统每次启动都会重新加载生成缓存吗?
11. 网页抓取、资源下载这类长耗时链路,这两个工具具体怎么实现?
12. 项目使用RabbitMQ实现异步处理,为什么不直接使用线程池来实现?
13. Agent项目中任务状态同时保存在Redis和MySQL,能不能只存在Redis?
14. Redis可以开启RDB持久化,就算服务重启数据也不会丢失,有没有考虑过这个方案?
15. 消息投递到RabbitMQ,如何防止消息重复消费,以及怎么避免消息丢失?
16. OJ在线判题系统为什么要拆分成微服务架构?
17. 远程调用为什么选用OpenFeign,而不是阿里的Dubbo?
18. 拆分后的微服务包含哪些模块?
19. 鉴权逻辑是放在网关层,还是用户服务模块里面?
20. 用户服务模块主要承担哪些职责?
21. 沙箱判题服务部署多个实例,OpenFeign调用时如何选择目标服务实例?
22. 如果某个服务实例宕机,OpenFeign继续发起调用会出现什么情况?
23. 用户提交代码,调用判题服务,判题需要30秒,但OpenFeign超时时间只配置了5秒,会发生什么?
24. 远程调用超时之后,沙箱内的代码还在继续运行,如何给用户返回结果?
25. 代码为什么必须放在沙箱环境执行,直接在宿主机运行不行吗?
26. 沙箱如何限制进程的CPU、内存、运行超时时间、网络访问以及文件读写权限?
27. 怎么校验用户上传的代码?比如用户提交while(true)死循环代码,持续占用CPU,该怎么处理?
28. 你提到可以杀掉进程,想问是直接停止对应的Docker容器吗?