虾皮搜索后端一面面经
- 轮次
- 一面
- 结果
- 未通过
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 请介绍第一个项目。
- 消息系统最终应选择推模式还是拉模式?
- 用户数量较多时,系统负载会不会过高?
- 是否阅读过 Netty 源码?Netty 有哪些核心模块?
- 时间轮如何实现?
- 消息队列中的 Direct 和 Fanout 分别适用于什么场景?
- 消息系统是否支持撤回?如何设计?
- 第二个项目中的子 Agent 如何调度和传递数据?
- 子 Agent 失败后如何恢复或续跑?
- 请介绍三层上下文存储。
- 使用向量方案时如何存储 Chunk?为什么检索可能较慢?
- 上下文写入数据库的节点如何设计?
- 如何实现二叉树的层序遍历?
- 多路搜索结果如何根据优先级做混合排序并输出最终列表?
- 搜索团队需要与哪些团队协作?团队规模如何?
《参考解析》
- 推拉模式:推模式延迟低,但消费者处理能力不一时容易积压;拉模式便于消费者控制节奏,但要处理轮询与延迟。实际系统常用服务端推送配合确认、重试和背压,或由 Broker 拉取后再向终端推送。
- 时间轮:把时间划分为固定槽位,任务按到期时间映射到槽并记录剩余轮数,指针每个 Tick 推进并处理当前槽。它适合大量近似定时任务,插入和删除成本低,但精度受 Tick 大小影响。
- Agent 续跑:把节点状态、输入输出和检查点持久化,恢复时从最近成功且仍有效的节点继续。副作用节点必须使用幂等键并回查执行结果,避免重启后重复发起。
- 层序遍历:用队列保存待访问节点,每次出队一个节点并按顺序加入左右子节点。若需按层输出,可在每轮先记录当前队列长度,处理固定数量的节点。