腾讯 ima 面经:Agent 项目与高并发后端八股
面试题目
项目相关:
- 自我介绍
- Agent 构建流程(组装链 + 执行链)及执行中的降级措施
- RAG 在项目中的具体使用(作为 advisor 角色)
- SSE 与 WebSocket 的区别,以及如何在 Trigger 层配置 SSE
- DDD 领域驱动设计的理解与分层
- 高并发本地服务平台(黑马点评)的测试并发度及 session 共享实现
- 无感 token 刷新与权限校验的实现逻辑
技术八股: 8. Cache Aside 缓存策略原理 9. 延迟双删的含义及 sleep 时间的确定 10. 互斥锁的实现:SETNX/EX 手写锁与 Redisson 对比 11. 布隆过滤器的原理及如何提高准确度 12. Lua 脚本的原子性实现 13. RabbitMQ 的使用场景及与其他队列对比 14. HyperLogLog 的原理 15. ZSet 底层实现(skiplist + ziplist)
算法手撕:
- 最大子数组和(DP 方案)
参考解析
- SSE vs WebSocket: SSE 是单向通信(服务器到客户端),基于 HTTP,协议简单;WebSocket 是全双工,基于 TCP 握手,适用于复杂交互。
- 延迟双删: 目的在于删除缓存后数据库同步前避免脏数据。sleep 时间通常应略大于数据库主从同步的耗时。
- Redisson 锁: 基于 Redis 的 Lua 脚本实现,支持锁的可重入性(Hash 结构存储线程重入次数)和自动续期(Watchdog 机制)。
- 布隆过滤器: 利用位数组和多个 Hash 函数。空间效率高但存在误判率,增加 Hash 函数数量可降低误判率,但会增加计算开销。
- Lua 原子性: Redis 执行 Lua 脚本时,会阻塞其他命令执行,从而确保脚本内的多条指令作为一个原子整体完成。