面灵AI

虾皮搜索后端一面面经

轮次
一面
结果
未通过
时间
2026-09
来源
牛客网

《面试题目》

  1. 请介绍第一个项目。
  2. 消息系统最终应选择推模式还是拉模式?
  3. 用户数量较多时,系统负载会不会过高?
  4. 是否阅读过 Netty 源码?Netty 有哪些核心模块?
  5. 时间轮如何实现?
  6. 消息队列中的 Direct 和 Fanout 分别适用于什么场景?
  7. 消息系统是否支持撤回?如何设计?
  8. 第二个项目中的子 Agent 如何调度和传递数据?
  9. 子 Agent 失败后如何恢复或续跑?
  10. 请介绍三层上下文存储。
  11. 使用向量方案时如何存储 Chunk?为什么检索可能较慢?
  12. 上下文写入数据库的节点如何设计?
  13. 如何实现二叉树的层序遍历?
  14. 多路搜索结果如何根据优先级做混合排序并输出最终列表?
  15. 搜索团队需要与哪些团队协作?团队规模如何?

《参考解析》

  1. 推拉模式:推模式延迟低,但消费者处理能力不一时容易积压;拉模式便于消费者控制节奏,但要处理轮询与延迟。实际系统常用服务端推送配合确认、重试和背压,或由 Broker 拉取后再向终端推送。
  2. 时间轮:把时间划分为固定槽位,任务按到期时间映射到槽并记录剩余轮数,指针每个 Tick 推进并处理当前槽。它适合大量近似定时任务,插入和删除成本低,但精度受 Tick 大小影响。
  3. Agent 续跑:把节点状态、输入输出和检查点持久化,恢复时从最近成功且仍有效的节点继续。副作用节点必须使用幂等键并回查执行结果,避免重启后重复发起。
  4. 层序遍历:用队列保存待访问节点,每次出队一个节点并按顺序加入左右子节点。若需按层输出,可在每轮先记录当前队列长度,处理固定数量的节点。