146、后端初级面试题精选
2000/6/7大约 6 分钟
后端初级面试题精选
本清单覆盖语言基础、数据库与部署运维三大模块共 18 题,每题给出参考答案、追问与考察要点,帮助初级后台工程师系统备战。
语言与框架基础
使用你熟悉的语言实现一个列表查询接口,描述路由、控制器、服务层的协作流程。
- 参考答案:示例(Express):路由将
/users针对 GET 映射到userController.list;控制器从req.query解析分页参数并调用userService.list;服务层负责业务校验与调用仓储;仓储通过 ORM/SQL 查询数据库并返回数据,最终控制器统一包装成{ data, pagination }响应。 - 追问:如何在接口中处理分页与统一响应格式?
- 考察要点:分层设计、REST 规范、统一返回体。
- 参考答案:示例(Express):路由将
解释同步与异步编程模型的区别,并各举一个实际场景。
- 参考答案:同步调用在返回前阻塞当前线程,适合 CPU 密集的本地计算;异步将任务交给事件循环或线程池,调用方可继续执行,例如 Node.js 处理 I/O、Java 使用 CompletableFuture 处理远程请求。正确选择模型可以提升吞吐并避免线程阻塞。
- 追问:什么时候会选择回调、Promise/Future 或协程?
- 考察要点:并发模型、I/O 密集型问题。
应用配置与敏感信息应该如何管理?请写出使用环境变量或配置中心的示例。
- 参考答案:原则是配置外部化和分环境管理:可在 Node.js 中通过 dotenv 读取
.env,访问process.env.DB_URL;在 Spring Boot 中使用配置中心(如 Nacos、Apollo)动态下发并结合加密;敏感信息要利用密钥管理系统(AWS KMS、Vault)。 - 追问:如何在不同环境自动注入配置?
- 考察要点:配置分环境、密钥管理、配置中心。
- 参考答案:原则是配置外部化和分环境管理:可在 Node.js 中通过 dotenv 读取
说明 MVC 与 MVVM 在后端框架中的职责划分,并举例。
- 参考答案:MVC 中 Controller 接受请求、调用 Service 处理业务、Service 依赖 Repository;View 在后端主要是模板或 JSON 序列化。MVVM 常用于前端,但在后端如 NestJS 可以通过依赖注入实现更细粒度的模块。重点是保持 Controller 精简、业务逻辑放在 Service。
- 追问:服务层是否应该直接依赖 ORM?
- 考察要点:架构模式、解耦。
为什么需要单元测试?请给出一个断言示例,并说明如何在 CI 中执行。
- 参考答案:单元测试可以确保函数在修改后行为稳定,防止回归。示例:
expect(sum(1,2)).toBe(3)(Jest)。CI 中可在 GitHub Actions 配置npm test -- --runInBand或mvn test,失败即阻断合并,保证基本质量。 - 追问:如何定义单元测试覆盖率目标?
- 考察要点:质量保障、自动化、覆盖率。
- 参考答案:单元测试可以确保函数在修改后行为稳定,防止回归。示例:
数据库与缓存
阐述事务的 ACID 特性,并结合实际业务说明其重要性。
- 参考答案:Atomicity 保证要么全部执行要么回滚,避免资金错账;Consistency 保证数据满足约束;Isolation 避免并发读写相互干扰;Durability 确保提交后宕机也不会丢失数据。银行转账、库存扣减都依赖这些特性。
- 追问:代码中如何控制事务边界?
- 考察要点:事务原理、业务场景。
设计用户登录表结构,需要哪些索引以及如何防止重复注册?
- 参考答案:基础字段:id、username、email、password_hash、salt、created_at、last_login;为 username/email 建唯一索引;可增加登录失败计数和状态字段;为了审计可建登录历史表(user_id、ip、ua、time)。
- 追问:如果需要支持多租户如何调整?
- 考察要点:索引设计、唯一约束、审计。
Redis 常见数据结构及适用场景分别是什么?
- 参考答案:String:缓存简单对象、分布式锁;Hash:缓存用户信息;List:队列/消息;Set:去重、共同好友;Sorted Set:排行榜;HyperLogLog:UV 统计;Bitmap:签到。应根据业务选择合适结构并设置过期策略。
- 追问:如何选择过期与淘汰策略?
- 考察要点:Redis 结构、使用场景。
说明乐观锁与悲观锁的区别,并给出实现示例。
- 参考答案:悲观锁假设冲突频繁,对记录加锁阻塞其他事务,如
SELECT ... FOR UPDATE;乐观锁假设冲突少,使用版本号或时间戳对比实现,更新时带上version条件,不满足则重试。 - 追问:乐观锁失败时重试策略如何设计?
- 考察要点:并发冲突、锁机制。
- 参考答案:悲观锁假设冲突频繁,对记录加锁阻塞其他事务,如
描述一次慢 SQL 排查的步骤及使用的工具。
- 参考答案:先开启慢查询日志定位 SQL,再用 EXPLAIN/EXPLAIN ANALYZE 查看执行计划;检查是否走索引、结果集大小、扫描类型;如需进一步分析可使用 pt-query-digest 或数据库性能视图;最终调整索引或语句。
- 追问:优化后如何验证效果?
- 考察要点:性能调优、工具链。
部署与运维习惯
部署后端应用的标准流程是什么?
- 参考答案:包括构建产物(Jar、Docker 镜像)、准备配置、数据库迁移、部署到环境(容器编排或物理机)、执行健康检查、灰度与回滚策略;需在脚本中自动化并写入文档。
- 追问:如何在 CI/CD 中自动完成这些步骤?
- 考察要点:部署流程、自动化。
健康检查接口应返回哪些字段?
- 参考答案:应返回状态码 200/503 区分健康状态,body 包含 service、status、version、依赖检查(数据库、缓存)的结果,并在异常时附带错误信息供运维定位。
- 追问:如何将其接入负载均衡?
- 考察要点:可观测性、负载均衡。
为什么要对日志分级?应如何归档和清理?
- 参考答案:日志分级(DEBUG/INFO/WARN/ERROR)便于检索和告警;可使用 logrotate 或 ELK,设置保留策略并将结构化日志发送到集中平台;敏感信息需脱敏处理。
- 追问:日志爆炸时如何限流?
- 考察要点:监控、合规、存储成本。
回忆一次 500 错误的定位过程,需要查看哪些信息?
- 参考答案:收集错误日志堆栈、请求参数、上下游服务调用、最近发布记录;若为 Java 服务可抓取线程栈,或在 Node.js 中查看 unhandledRejection;最终补充监控与自动告警。
- 追问:如何防止类似问题再次发生?
- 考察要点:排障流程、复盘。
Git 分支与发布如何管理?
- 参考答案:常用 GitFlow:main 保存稳定版本、develop 用于集成、feature 分支开发新功能、release 分支准备上线、hotfix 应急修复;发布时创建 tag 并生成 Release Note。
- 追问:遇到冲突和回滚如何处理?
- 考察要点:版本管理、协作。
如何在项目中落地代码审查(Code Review)并提升质量?
- 参考答案:制定 Review Checklist、设置必须 Review 人数、在 CI 中嵌入静态检查;统计审查时长与缺陷发现率,持续优化流程。
- 追问:Review 效率低时怎么办?
- 考察要点:协作流程、质量保障。