文章
大厂面试
程序员奶牛-大厂面试合集
根据得物社区工程、小红书数据库中间件、原力灵机等面试问题合并整理 同义问题已合并;能体现考察深度的连续追问予以保留。本文只包含问题,不包含参考答案。
一、自我介绍与求职意向#
- 请在 5 分钟内做一个简单的自我介绍。
- 请选择一个最能展现个人特点的项目,并重点介绍其中的亮点、挑战和有意思的设计。
- 你可以实习多久?是否能够连续实习 5~6 个月?
- 你未来主要想做传统后端、数据库中间件,还是 Agent 应用开发?为什么?
二、短视频 Feed 流项目#
1. 项目架构与数据模型#
- 请介绍短视频 Feed 流系统的整体架构、核心链路和你负责的部分。
- Feed 流项目中最主要的技术挑战是什么?你做了哪些有价值的取舍或优化?
- Feed 流的核心数据模型是怎样的?哪些数据最终持久化到 MySQL?
- 用户关注关系和粉丝关系表是如何设计的?
- Feed 流中的 MySQL 索引是如何设计的?为什么这样设计?
- 项目中的业务数据量有多大?MySQL、Redis 分别保存了多少数据?
2. 查询与分页#
- Feed 为什么采用游标分页?游标分页的原理是什么?
- 游标分页为什么能够缓解深分页问题?它与
LIMIT offset相比有什么区别? - ID-Detail 分离解决了什么问题?读取一页 Feed 时,ID 与详情是如何查询和组装的?
3. 推拉结合与大 V 分发#
- 普通作者和大 V 分别采用什么分发模式?各自的读写成本是什么?
- 大 V 拥有百万级粉丝时,发布内容产生的写扩散问题如何处理?
- 推拉模式的切换阈值为什么设置为一万粉丝?为什么不是更多或更少?
- 既然读扩散会增加读取成本,为什么大 V 反而适合使用拉模式?
- 推拉结合相对于纯推或纯拉,主要优化了哪一部分性能?又引入了哪些复杂度?
- 为什么不能对所有作者统一采用拉模式?
- 如果一个用户关注的全部都是大 V,他的请求是否会退化成纯拉模式?这种最坏读路径如何处理?
4. 压测与容量评估#
- 做 Feed 压测时,整套服务、MySQL、Redis 和消息队列的测试环境是如何搭建的?
- 压测使用了怎样的数据规模、请求比例和并发模型?
- 如何根据 QPS、P95/P99、错误率、数据库连接数和 Redis 延迟判断系统瓶颈?
三、多级缓存与 Redis 故障治理#
1. 本地缓存、Redis 与 MySQL#
- 本地缓存、Redis、MySQL 的三级数据访问链路分别承担什么职责?
- 什么数据适合放在本地缓存?什么数据不适合本地化,更适合放在 Redis 或权威存储?
- 用户或作者的基本信息为什么适合放在本地缓存?
- 本地缓存的生命周期如何管理?采用 TTL、容量淘汰还是主动失效?
- 本地缓存的过期时间一般设置多久?
- 为什么选择 15 分钟,而不是更短或更长?
- TTL 低于 15 分钟为什么可能影响性能或用户体验?本地缓存未命中后不是还可以访问 Redis 吗?
2. MySQL 与 Redis 一致性#
- MySQL 与 Redis 之间的数据一致性如何保证?
- 如果采用定期检查或对账,具体检查什么、如何发现差异、如何修复?
- MySQL 数据同步或回灌到 Redis 需要时间,数据量很大时如何避免一次性重建带来的冲击?
3. Redis 故障追问链#
- Redis 整体不可用时,系统如何处理?
- Redis 挂掉后,C 端流量直接回源 MySQL,数据库能否承受?
- Redis 集群部分节点或一半节点故障时,会对 MySQL 造成怎样的冲击?
- 为了保护 MySQL,应限制哪一层、哪一类请求的流量?
- Redis 故障时,系统是直接拒绝访问、返回降级数据,还是允许部分请求回源?
- 用户侧会看到报错、旧数据还是简化结果?如何确定降级优先级?
- Redis 节点故障并发生数据丢失时,缓存如何恢复和重建?
- 恢复期间如何避免大量请求与全量回灌同时压垮 MySQL?
四、Go 并发、内存与 GC#
1. Goroutine 与 GMP#
- Go 的 goroutine 与操作系统线程是怎样对应的?
- 与 Python 的并发方式相比,goroutine 有哪些优势和缺点?
- 为什么 goroutine 通常比线程轻量?它是否在所有场景下都更快?
- Java 的协程或虚拟线程与 Go goroutine 有什么差别?协程一定比线程快吗?
- 请介绍 GMP 调度模型中 G、M、P 的职责及调度流程。
- Goroutine 发生阻塞系统调用时,G、M、P 分别会发生什么变化?
- 多个 P 都有本地运行队列时,调度器如何进行任务分配和负载均衡?
- 什么场景下增加线程或 goroutine 能提升性能?什么场景下不能?
- 高并发是否一定能够提效?goroutine 是否创建得越多越好?
2. Channel 与同步原语#
- Channel 的底层结构和工作原理是什么?
- 无缓冲 channel 和有缓冲 channel 有什么区别?分别适合什么场景?
- 使用 channel 时有哪些需要注意的点?
- 你了解
sync.WaitGroup吗?它有哪些主要方法,使用时有哪些风险? Mutex与RWMutex有什么区别?什么场景下优先选择RWMutex?- 什么是自旋锁?它与互斥锁有什么区别,分别适合什么场景?
3. Map 与并发安全#
- 使用 Go 原生 map 时有哪些需要注意的地方?
- Go 原生 map 是并发安全的吗?多个 goroutine 并发读写会发生什么?
- Map 并发读写不安全的底层原因是什么?
- 如何解决 map 的并发安全问题?
sync.Map适合什么场景?它的实现原理是什么?- 传统
sync.Map中的只读区read和脏区dirty如何协作并保证数据可见性?
4. 内存管理与 GC#
- Go 的内存是如何管理的?对象如何分配和回收?
- 常见的垃圾回收算法有哪些?它们分别适合什么场景?
- Go 的垃圾回收是否只有三色标记?完整 GC 流程还包括哪些阶段?
- 请详细介绍三色标记法的工作过程。
五、MySQL、索引与分库分表#
1. SQL 执行链路#
- 一条
INSERT或UPDATESQL 发送到 MySQL 后,服务器内部会经历哪些环节? - SQL 执行过程中,连接层、解析器、优化器、执行器、InnoDB、Buffer Pool、redo log、undo log 和 binlog 分别起什么作用?
2. InnoDB 与 B+ 树索引#
- MySQL 索引有哪些分类?
- InnoDB 索引是如何实现的?
- B+ 树的数据结构是什么样的?InnoDB 为什么选择 B+ 树?
- B+ 树索引有哪些优势?
- 哪些情况会导致 B+ 树索引的查询性能变差?
- 索引字段被高并发更新时,会对 B+ 树和写入性能产生什么影响?
3. 索引设计与优化#
- 创建索引应遵循哪些原则?什么场景需要创建索引?
- 结合 Feed 流项目,哪些字段适合建立索引?哪些字段不适合?
- 什么是二级索引和回表?
- 什么是覆盖索引?如何通过覆盖索引减少回表?
- 什么是联合索引的最左前缀原则?
- 多列联合索引应该如何确定字段与顺序?
- 哪些写法或场景会造成索引失效?
4. 慢 SQL 排查#
- 一条 SQL 查询很慢,你的完整排查思路是什么?
- 如果 SQL 扫描行数很多、查询范围很大,可以从哪些方面改造?
5. 分库分表与中间件#
- 项目中是否使用过分库分表?你如何理解分库、分表的适用场景和代价?
- 一个已经上线且持续有业务流量的单库单表系统要进行拆分,需要考虑哪些问题?完整迁移流程如何设计?
- 你了解哪些分库分表开源组件或数据库中间件?
6. Go 数据库连接池#
- Go 连接 MySQL 使用了什么驱动、ORM 或组件?
- 数据库连接池存在的意义是什么?
- ORM 或数据库连接池有哪些关键配置参数?这些参数应该如何设置?
六、Redis 数据结构、Rehash 与集群#
1. 基础数据结构#
- Redis 支持哪些主要数据结构?
- 这些数据类型的底层编码分别是什么?
- Redis Set 通常使用什么底层结构?
- Redis ZSet 为什么能够排序?它的底层结构是怎样的?
2. 缓存异常#
- 什么是缓存穿透、缓存击穿和缓存雪崩?三者有什么区别?
3. Redis Hash 渐进式 Rehash#
- Redis Hash 的底层结构和扩容机制是什么?
- Redis 为什么采用渐进式 rehash,而不是一次性迁移全部数据?
- Rehash 期间的数据具体如何迁移?查询、写入和删除如何处理两张表?
- Redis 是按每秒固定数量迁移,还是由其他机制推进迁移?
- 如果没有客户端请求、程序处于空闲状态,rehash 还会继续吗?
4. Redis 集群与扩容#
- Redis 有哪些集群或高可用模式?分别适合什么场景?
- Redis Cluster 如何实现数据分片?
- 集群增加分片或节点时,会发生什么?数据如何迁移?
- 假设集群从 8 个分片扩到 9 个分片,原来的哈希映射是否会失效?如何完成重新分片?
- Redis 集群会发生数据倾斜吗?常见原因是什么,如何解决?
七、RabbitMQ 与消息可靠性#
- RabbitMQ 如何保证消息从生产者、Broker 到消费者的完整链路不丢失?
- 生产者确认、消息持久化、镜像或仲裁队列、消费者 ACK、重试与死信队列分别解决什么问题?
八、RAG、检索与排序#
1. 文档处理与召回#
- RAG 的文档分块策略是如何定义的?分块大小和重叠窗口如何选择?
- 为什么同时选择 Milvus 和 Elasticsearch?两者分别承担什么职责?
- Milvus 语义召回与 Elasticsearch 关键词召回后,如何进行排序融合?
- 你了解 Elasticsearch 的倒排索引吗?它是如何构建和查询的?
2. 检索路由#
- 当一个 Query 进入系统时,如何判断应该走 Elasticsearch 关键词检索、向量检索、RAG 还是 SQL Agent?
- 检索路由由规则、分类模型还是大语言模型完成?为什么?
- 如果大模型对检索意图发生误判,系统如何发现、兜底和纠正?
九、Agent、MCP 与 AI Coding#
1. Agent 框架与范式#
- 你了解哪些 Agent 常见范式,例如 ReAct?它们有什么区别和适用场景?
- 你对 LangChain 和 LangGraph 了解多少?实际使用过哪些能力?
- 你是否了解或使用过 OpenCloud 这类 Agent 调度工具?
- RAG 应该如何与 Agent 结合?
- Agent 遇到公开网络中不存在的私有或内网文档时,如何安全获取这部分知识?
2. MCP#
- 你了解 MCP 协议吗?它解决了什么问题?
- MCP 中的 Server(或 Service)、Resource 和 Prompt 分别是什么?它们有什么区别?
3. SQL Agent#
- 请介绍 SQL Agent 从接收用户问题到返回结果的完整执行链路。
- SQL Agent 如何理解自然语言、获取数据库 Schema、生成 SQL、校验权限、执行查询并处理结果?
- SQL Agent 如何限制写权限并防止危险 SQL?
4. 对话记忆与任务编排#
- 多轮对话中的记忆压缩有哪些常见方法?
- 短期记忆和长期记忆分别如何设计?
- 长期记忆存放在 MySQL 时,表结构如何设计?
- 一个长任务或复杂任务执行时,如果上下文过长或模型注意力被分散,应如何拆解和编排任务?
- 如何编排 AI 编程工具,使不同阶段共享必要上下文,又避免上下文持续膨胀?
5. AI Coding 与 Skills#
- 你了解哪些 Web Coding 或 AI Coding Skills?实际使用过哪些?
- 如何根据项目需求设计或选择适合自己的 Skill?
- 如何保证 AI 生成代码的质量和正确性?
- 你会如何使用代码审查、静态检查、单元测试、集成测试和多模型复核来校验生成结果?
十、现场编码#
- 请现场完成一道算法或编码题,并说明思路、复杂度、边界条件和测试用例。
十一、面试收尾与反问#
- 部门的核心业务、当前技术架构和主要挑战是什么?
- 这个岗位希望候选人重点掌握哪些能力?
- 结合我的 Feed、RAG 和 Agent 项目,您对后续学习方向有什么建议?
- 团队在 Agent 开发、AI Coding 和 Skills 方面有哪些实践或建议?
- 本轮面试结果大概什么时候出来?后续流程是什么?