趣链科技 Java 实习多轮面经:批量导入、异步任务与判题沙箱
- 轮次
- 一面、二面、终面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- HashMap 如何处理哈希冲突,synchronized 与 ReentrantLock 有什么区别?
- JVM 的运行时内存区域有哪些,对象和静态引用分别如何存放?
- Spring 单例 Bean 是否天然线程安全?
- InnoDB 与 MyISAM 有什么区别,ACID 分别是什么?
- 如何用 EXPLAIN 排查慢查询,联合索引条件的书写顺序会影响使用吗?
- 药品匹配为什么要结合编码、名称、规格和厂家?
- 十万行 Excel 如何分批导入,批次中途失败后哪些数据应该提交?
- 重复文件、批次内重复、跨批次和历史数据重复如何分别识别?
- EhCache 与 Redis 有什么区别,项目为什么同时使用它们?
- 耗时工具为什么异步执行,消息队列相对线程池有什么作用?
- 任务状态为什么同时写 Redis 和 MySQL,RDB 能否保证重启零丢失?
- RabbitMQ 如何防止消息丢失,重复消费如何处理?
- 判题系统为什么拆服务,OpenFeign 与 Dubbo 如何选择?
- 网关与用户服务分别承担什么鉴权职责?
- 多个判题实例如何选择,远程调用失败或超时后怎么办?
- 调用超时但沙箱仍在执行,怎样把任务结果交给用户?
- 为什么需要沙箱,如何限制 CPU、内存、运行时间、网络和文件权限?
- 遇到陌生项目或难排查的问题时,你怎样学习和定位?
- 看不懂生成的代码时如何处理,你能提供什么独立判断?
- 你的实习安排、职业规划、优势与短板分别是什么?
《参考解析》
导入的事务边界
先约定业务要整份文件成功,还是允许按批次成功。分批提交时,第十批失败不应声称前九批也已回滚;整份原子导入则可以先进入暂存区,验证通过后再发布结果。跨历史数据去重需要数据库唯一约束兜底,不能只依赖当前批次的 HashSet。
异步任务的可靠性
线程池能把工作移出请求线程,但进程退出后内存任务会消失。消息队列要配合发布确认、持久化与消费确认;执行成功后再确认消息,重复投递通过任务编号和状态转换处理。RDB 是时间点快照,不能据此承诺故障后零丢失。
超时与取消
调用方超时只说明等待结束,不等于沙箱进程停止。提交时返回任务编号,客户端查询任务状态;后台到达执行期限后终止该任务的进程组或隔离实例,并记录最终状态。资源限制必须在隔离层生效,靠扫描代码中的 while(true) 无法覆盖所有无限循环。