唯品会广告中台实习生一二面面经
《面试题目》
- 简单介绍项目主要工作流程。
- 审核机制中是否有投放后的 AI 纠错机制。
- 通过哪些监控指标和告警判断服务是否可用。
- 首页需要并发调用多个下游接口,如果某个服务超时无返回,如何兜底。
- 线程池有哪些核心参数,什么情况下会触发拒绝策略。
- 首页多接口并发场景下如何选择线程池拒绝策略,理由是什么。
- 使用线程池提交任务后,如何获取执行结果。
Future.get设置 40ms 超时后,子任务是否还会继续执行,如何快速中断。- 数据库慢查询的排查和优化思路是什么。
- SQL 有目标索引但执行计划没走索引时,如何强制指定索引。
- ThreadLocal 的底层数据结构是什么,使用时有哪些注意事项。
- 在线程池中使用 ThreadLocal 会产生什么问题,如何避免脏数据。
- Redis 缓存击穿如何处理,分布式锁方案和逻辑过期方案各有什么优缺点。
- MySQL 数据同步到 ES 时如何保证一致性。
- Kafka 同步 MySQL 到 ES 时,写入 ES 失败有哪些降级方案。
- MySQL 和 ES 存在短暂不一致时,如何感知并纠正。
- ES 深度分页问题如何解决。
- 运维 Agent 能重启机器、容器和服务时,如何管控高危操作。
- RAG 知识库文档切片如何实现,过程中可能遇到哪些问题。
- 算法题:K 个一组反转链表。
- 二面算法题:原地删除数组中的重复元素。
- String 相关代码片段会创建多少对象,最终变量值是什么。
- Java 优先队列底层如何实现,堆适合解决哪些问题。
- TCP 四次挥手为什么比三次握手多一次。
- 举例说明自己的担当和扛事能力。
《参考解析》
- 多接口并发兜底:可以用
CompletableFuture或线程池并行请求,单接口设置超时、默认值和降级结果。主流程要区分强依赖和弱依赖,弱依赖失败不阻塞首页整体返回,并通过监控记录下游超时率。 - 线程池拒绝策略选择:首页请求是在线链路,通常不适合无限排队。可以设置有界队列、合理超时和降级策略;拒绝时返回部分数据或默认模块,避免调用方线程被
CallerRunsPolicy拖垮。 - ThreadLocal 在线程池中的风险:线程会复用,ThreadLocalMap 中的旧值若不清理会污染下一次任务,还可能造成内存泄漏。最佳实践是在
try/finally中调用remove(),并避免存放大对象。 - MySQL 到 ES 的一致性:常见方案是数据库事务提交后写消息或监听 binlog,由消费者异步写 ES。写 ES 失败要进入重试队列或补偿表,定时按更新时间、版本号或校验任务修复不一致。
- ES 深度分页:
from + size深分页会扫描和排序大量数据。可以使用search_after搭配稳定排序字段,或用 scroll/PIT 做批量导出场景;面向用户查询时应限制最大页数。 - K 个一组反转链表:先检查剩余节点是否足够 K 个,再在组内做原地反转,最后把上一组尾节点连接到当前组新头。关键是维护
pre、cur、next三类指针,避免断链。