全栈开发面试八股文|60 道核心题速查与复习手册

<- Blog

覆盖 HTML/CSS、JavaScript/TypeScript、React/Vue、计算机网络、后端 API、数据库、Redis、操作系统、Web 安全、工程化、系统设计。适合初级到中高级全栈岗位的系统性复习。

文档定位: 面试知识笔记与口述复习用,不替代刷题、框架专项或真实项目实践。

使用说明

  • ★ 基础: 概念正确,能举例说明。
  • ★★ 中级 / 高频: 能讲清机制,并在实际代码中应用。
  • ★★★ 进阶 / 系统设计: 能权衡方案,解释故障与边界。
  • 每题按照 面试答案 → 原理 → 项目应用 复习;建议口述 30~90 秒,再自问一个追问。

模块目录与优先级

模块 核心内容 题数 优先级
01 HTML / CSS / 浏览器 页面结构、布局、渲染与性能 5 高
02 JavaScript / TypeScript 作用域、异步、原型、类型系统 6 极高
03 React / Vue 组件、状态管理、客户端与服务端渲染 5 极高
04 计算机网络 TCP、HTTP、HTTPS、跨域与缓存 6 极高
05 后端开发 / API 接口设计、身份认证、并发、幂等 6 极高
06 数据库 / SQL 索引、事务、隔离、锁、分页与优化 7 极高
07 Redis / 消息队列 缓存一致性、高并发与异步任务 5 高
08 操作系统 / Linux 进程线程、内存、死锁与排障 5 高
09 Web 安全 注入、跨站攻击、密码与权限 5 极高
10 Git / 测试 / 部署 版本管理、CI/CD、运行环境与观测 5 高
11 系统设计 / 项目经验 架构、限流、文件上传、扩展与选型 5 极高

01 · HTML / CSS / 浏览器

页面结构、布局、渲染与性能 · 共 5 题

Q01|HTML 语义化是什么,为什么要使用语义化标签? ★

  • 面试答案: 根据内容含义选择 <header>、<nav>、<main>、<article> 等标签,而不是所有内容都用 <div>。
  • 底层原理: 语义化结构向浏览器、搜索引擎、屏幕阅读器提供更明确的内容关系;它不保证 SEO 排名,但有助于内容可理解性和无障碍访问。
  • 项目应用: 文章详情页使用 <article>,导航用 <nav>,确保标题层级正确。

Q02|CSS 盒模型是什么? ★

  • 面试答案: 盒模型包含 content、padding、border、margin。默认 content-box 的 width 只包含内容;border-box 的 width 包含内容、padding 和 border。
  • 底层原理: 布局时浏览器依据盒模型计算元素占用尺寸;margin 在边框之外,不计算在 border-box 指定宽度之内。
  • 项目应用: 全局设置 box-sizing: border-box,防止卡片加内边距后超出设计宽度。

Q03|Flexbox 和 Grid 有什么区别? ★

  • 面试答案: Flexbox 主要适用于一维排列;Grid 更适合同时管理行列的二维布局。
  • 底层原理: Flexbox 通过主轴和交叉轴分配尺寸与对齐;Grid 先定义网格轨道,再分配单元区域。
  • 项目应用: 导航栏、按钮组用 Flex;仪表盘和卡片矩阵用 Grid。

Q04|输入 URL 到页面显示经历哪些过程? ★★

  • 面试答案: 可能经历 DNS 解析、连接建立、TLS 握手、HTTP 请求响应、解析 HTML/CSS、加载资源、执行脚本、布局、绘制和合成。
  • 底层原理: 浏览器将文档与样式转换成可绘制的渲染数据,网络、脚本和渲染都可能影响首屏;HTTP 版本、缓存与资源加载策略会改变具体路径。
  • 项目应用: 用 DevTools Network 和 Performance 区分 TTFB、下载、JS 执行和渲染瓶颈。

Q05|什么是重排与重绘,如何减少页面卡顿? ★★

  • 面试答案: 重排(Layout/Reflow)重新计算尺寸与位置;重绘(Paint)更新外观。两者不是完全独立的,布局变化往往需要绘制。
  • 底层原理: 修改宽高等几何属性通常涉及布局;适宜条件下 transform 和 opacity 可主要在合成层执行。
  • 项目应用: 大量动画优先改变 transform,合并 DOM 读写,避免反复触发强制同步布局。

02 · JavaScript / TypeScript

作用域、异步、原型、类型系统 · 共 6 题

Q06|var、let、const 有何区别? ★

  • 面试答案: var 是函数作用域,允许重复声明;let 和 const 为块级作用域。const 禁止对绑定重新赋值,但对象内容仍可能变化。
  • 底层原理: let/const 具有暂时性死区;提升(hoisting)不意味着可以在声明前访问。
  • 项目应用: 优先使用 const,需要重赋值使用 let,新代码避免 var。

Q07|什么是闭包? ★★

  • 面试答案: 函数连同其定义时的词法环境形成闭包,因此函数离开创建位置后仍能访问相关外层变量。
  • 底层原理: 被引用的词法绑定会持续存在,直到没有引用需要它们;闭包可能延长对象生命周期。
  • 项目应用: 生成带私有计数的回调、封装状态、实现简单缓存。

Q08|什么是原型链? ★★

  • 面试答案: 读取属性时先检查对象自身,未找到再沿内部原型继续向上查找,最终可到达 null。
  • 底层原理: JavaScript 使用基于原型的继承;class 是常用语法形式,但方法共享仍常由原型实现。
  • 项目应用: 理解实例方法共享、instanceof 和继承问题。

Q09|什么是事件循环(Event Loop)? ★★

  • 面试答案: 同步代码先执行;当前任务结束后处理微任务(如 Promise reaction),再进入后续任务,浏览器在合适时机执行渲染。
  • 底层原理: setTimeout(...,0) 不保证立即执行;Promise 微任务通常早于下一轮定时器任务。
  • 项目应用: 解释日志顺序、async/await、UI 更新时机与长任务造成的卡顿。

Q10|Promise、async/await 与回调有什么区别? ★★

  • 面试答案: 回调是函数传递方式;Promise 表示异步操作结果;async/await 是围绕 Promise 的顺序式语法。
  • 底层原理: await 暂停的是当前异步函数的后续执行,不会阻塞整个 JS 线程;Promise.all 并发等待独立任务。
  • 项目应用: 并发获取用户信息与文章列表,配合 try/catch 和超时处理。

Q11|TypeScript 与 JavaScript 有什么区别? ★★

  • 面试答案: TypeScript 提供静态类型、接口、泛型与工具类型,通常编译为 JavaScript;类型断言不等于运行时验证。
  • 底层原理: 类型系统主要在构建期工作,来自网络、表单或数据库的不可信数据仍需实际校验。
  • 项目应用: 用接口约束前后端数据,使用 Zod / JSON Schema 验证 API 输入输出。

03 · React / Vue

组件、状态管理、客户端与服务端渲染 · 共 5 题

Q12|React 和 Vue 的更新机制有何不同? ★★

  • 面试答案: React 通常通过 state/props 更新触发组件重新渲染与协调;Vue 通过响应式依赖追踪更新相关效果和组件。
  • 底层原理: 两者均可获得高效 UI 更新,但状态跟踪与渲染模型不同。
  • 项目应用: 开发动态资讯流时,正确管理组件状态与列表更新。

Q13|React 的 key 为什么重要? ★★

  • 面试答案: 稳定的 key 帮助 React 识别同级列表中元素的身份;列表增删排序时使用数组索引可能造成组件状态错位。
  • 底层原理: 协调算法利用 key 判断保留、移动或重建节点。
  • 项目应用: 新闻列表用文章 ID 作为 key,而非当前位置序号。

Q14|React useEffect 做什么? ★★

  • 面试答案: useEffect 用于将组件与外部系统同步:订阅、计时器、网络连接、第三方控件等,并通过清理函数释放资源。
  • 底层原理: 依赖变更时先清理旧 effect 再建立新 effect(适用情况下);不要用 effect 存放所有纯计算。
  • 项目应用: 进入实时页面建立 WebSocket 订阅,离开时解除监听。

Q15|CSR、SSR、SSG 区别是什么? ★★

  • 面试答案: CSR 主要在浏览器生成 UI;SSR 在请求时服务端生成 HTML;SSG 在构建时预生成 HTML。
  • 底层原理: 影响首屏、缓存、SEO、构建成本和 Hydration 的选择,没有全场景最优方案。
  • 项目应用: 博客适合 SSG;登录管理台常用 CSR;公开动态页面按需求采用 SSR 或混合模式。

Q16|本地状态、全局状态、服务端状态如何区分? ★★

  • 面试答案: 本地状态由小范围组件持有;全局状态用于多个区域共享的客户端状态;服务端状态具有异步读取、失效和缓存语义。
  • 底层原理: 把所有数据塞进全局状态会增加同步复杂度;服务器数据缓存与 UI 状态生命周期不同。
  • 项目应用: 弹窗状态局部管理;主题或登录信息共享;文章列表用查询缓存工具管理。

04 · 计算机网络

TCP、HTTP、HTTPS、跨域与缓存 · 共 6 题

Q17|TCP 为什么是三次握手? ★★

  • 面试答案: 客户端 SYN,服务端 SYN+ACK,客户端 ACK。用于同步初始序列号并确认建立连接所需的双向通信条件。
  • 底层原理: 双方要分别确认对方的序列空间和连接状态,不能简单理解为“证明两边一定能永久通信”。
  • 项目应用: 排查连接超时、SYN 队列积压、防火墙阻断。

Q18|TCP 与 UDP 区别是什么? ★

  • 面试答案: TCP 提供面向连接、可靠、有序的字节流;UDP 是无连接数据报,不自带可靠性和顺序保障。
  • 底层原理: TCP 使用确认、重传、流控与拥塞控制;UDP 允许应用自主设计协议。
  • 项目应用: 常规 HTTP/1.1 与 HTTP/2 使用 TCP;HTTP/3 基于 UDP 上的 QUIC。

Q19|GET、POST、PUT、PATCH、DELETE 的语义? ★

  • 面试答案: GET 获取资源;POST 提交处理或创建;PUT 创建/完整替换目标资源;PATCH 部分修改;DELETE 删除。GET、PUT、DELETE 按 HTTP 语义幂等,POST/PATCH 不保证。
  • 底层原理: 幂等是多次同样请求带来的预期服务器状态效果相同,并非每次响应完全一样。
  • 项目应用: 设计 /api/articles 路由,订单创建额外使用幂等键。

Q20|HTTP 与 HTTPS 区别是什么? ★★

  • 面试答案: HTTPS 是通过 TLS 保护的 HTTP,提供传输加密、完整性和服务器身份认证。
  • 底层原理: TLS 通过握手协商密钥与算法、验证证书,再用对称加密保护应用数据。
  • 项目应用: 安全部署登录、管理后台和 API,配置证书自动续期。

Q21|什么是同源策略与 CORS? ★★

  • 面试答案: 同源由协议、主机、端口确定;CORS 允许服务端通过响应头告知浏览器是否允许跨源读取响应,部分请求先进行 OPTIONS 预检。
  • 底层原理: CORS 是浏览器约束,不是认证机制;服务端仍必须验证身份和权限。
  • 项目应用: 前端 app.example.com 调用 api.example.com,按需设置允许来源。

Q22|HTTP 强缓存与协商缓存区别? ★★

  • 面试答案: 强缓存依据 Cache-Control 等新鲜度策略直接复用;协商缓存通过 ETag/If-None-Match 或时间验证,未变化可返回 304。
  • 底层原理: 资源版本与缓存策略共同决定请求是否访问服务器、是否下载正文。
  • 项目应用: 带哈希名的静态资源长期缓存;频繁变化的 HTML 使用重新验证策略。

05 · 后端开发 / API

接口设计、身份认证、并发、幂等 · 共 6 题

Q23|什么是 RESTful API? ★

  • 面试答案: REST 是强调资源、统一接口、无状态等约束的架构风格,HTTP API 常用 URL 标识资源、HTTP 方法表达操作。
  • 底层原理: 接口设计追求可理解和一致性,不是“用了 GET/POST 就一定 RESTful”。
  • 项目应用: GET /api/articles/123、POST /api/articles、PATCH /api/articles/123。

Q24|Authentication 与 Authorization 区别? ★

  • 面试答案: Authentication(认证)确认身份;Authorization(授权)判定当前身份可以访问什么数据或执行什么动作。
  • 底层原理: 已登录不代表能够读取任意对象,必须在服务端校验资源归属与角色权限。
  • 项目应用: 普通用户只能编辑自己的文章,管理员另有管理权限。

Q25|Session 与 JWT 有什么区别? ★★

  • 面试答案: Session 通常由服务端持有会话状态,客户端保存会话 ID;JWT 携带签名保护的声明,可被验证但撤销与失效设计更复杂。
  • 底层原理: JWT 的有效签名只证明令牌未被非法篡改且符合验证要求,不代表一定具有最新权限。
  • 项目应用: 管理后台可选 Session;跨服务 API 视需要使用短期 Token 与刷新机制。

Q26|中间件是什么? ★★

  • 面试答案: 中间件位于请求处理链中,执行复用逻辑,如日志、认证、校验、限流、异常处理。
  • 底层原理: 将横切关注点从业务代码分离,便于组合、审计和统一管理。
  • 项目应用: 在 Express/FastAPI 中统一附加 request-id 并记录访问日志。

Q27|同步、异步、并发、并行有什么区别? ★★

  • 面试答案: 同步/异步描述等待与完成通知方式;并发表示多个任务交替推进;并行表示任务在同一时刻实际同时执行。
  • 底层原理: 异步 I/O 减少等待资源占用,但 CPU 密集型任务需要进程、线程或独立工作器等方案。
  • 项目应用: 多个外部 API 并发调用;图像编码转为后台任务。

Q28|为什么要做接口幂等? ★★★

  • 面试答案: 网络重试或消息重复可能导致重复下单、支付、扣款,关键业务需依据唯一请求标识防止重复执行。
  • 底层原理: 请求超时不等于服务器未处理;幂等键与唯一约束/事务配合才可靠。
  • 项目应用: Idempotency-Key + 数据库唯一索引保存处理结果。

06 · 数据库 / SQL

索引、事务、隔离、锁、分页与优化 · 共 7 题

Q29|为什么关系型数据库常用 B+ 树索引? ★★

  • 面试答案: B+ 树扇出高、树较浅,可降低随机页读取;叶子键有序,有利于范围查询与排序。
  • 底层原理: 索引查找成本与树高、页大小、选择性相关;不同数据库也支持哈希、GIN/GiST 等其他索引。
  • 项目应用: 为 (published_at, id) 建合适索引支持时间线查询。

Q30|联合索引与最左前缀原则是什么? ★★

  • 面试答案: 多列索引按定义的键顺序组织;通常从前导列开始匹配才能充分利用有序性。
  • 底层原理: 对于 (user_id, published_at),先按 user_id 再在该范围内按时间排序。具体可用程度由优化器和谓词决定。
  • 项目应用: 查询某作者最新文章时评估 (user_id, published_at DESC) 索引。

Q31|ACID 分别是什么? ★★

  • 面试答案: A 原子性:整体提交/回滚;C 一致性:遵守约束;I 隔离性:并发事务有受控的相互影响;D 持久性:成功提交可恢复。
  • 底层原理: 依赖日志、锁、MVCC、恢复机制共同实现;应用层业务不变量仍需正确设计。
  • 项目应用: 在转账、库存扣减、订单创建中使用事务。

Q32|事务隔离级别和 MVCC 是什么? ★★★

  • 面试答案: 标准常见四级为读未提交、读已提交、可重复读、可串行化;MVCC 使用不同版本/快照降低读写冲突。
  • 底层原理: 并发读写可能导致脏读、不可重复读、幻读等;具体保证取决于数据库实现及隔离级别。
  • 项目应用: 高并发库存或资金业务要显式考虑竞态、锁和隔离语义。

Q33|慢 SQL 怎么排查? ★★

  • 面试答案: 定位慢查询和参数,分析 EXPLAIN/实际执行计划、扫描行数、索引、连接、排序、锁等待与资源占用。
  • 底层原理: 优化器选择的计划影响物理访问成本;索引不匹配、数据分布或复杂排序会造成大量工作。
  • 项目应用: 通过 EXPLAIN ANALYZE(数据库支持时)定位时间线查询瓶颈。

Q34|乐观锁与悲观锁区别? ★★★

  • 面试答案: 悲观锁先控制对资源的并发访问;乐观锁在写入时检查版本或条件,发现冲突则拒绝或重试。
  • 底层原理: 争用程度、事务时长、写入冲突概率影响选择。
  • 项目应用: 文档编辑用 WHERE id=? AND version=? 防止覆盖更新。

Q35|为什么深分页慢?如何优化? ★★★

  • 面试答案: 大 OFFSET 常需扫描或跳过大量记录;游标分页依据上一页排序键继续查找更高效。
  • 底层原理: 索引有序扫描可以直接从键范围开始,避免为跳过旧记录付出大量成本。
  • 项目应用: 按 (published_at DESC, id DESC) 建复合索引与稳定游标。

07 · Redis / 消息队列

缓存一致性、高并发与异步任务 · 共 5 题

Q36|Redis 为什么快? ★★

  • 面试答案: 常用数据结构在内存操作,减少磁盘随机 I/O,配合高效事件驱动网络处理与低复杂度命令。
  • 底层原理: Redis 不是所有命令都快;大对象、阻塞命令、高网络延迟仍会造成瓶颈。
  • 项目应用: 热点页面缓存、限流计数、临时令牌与排行榜。

Q37|如何保证缓存与数据库一致性? ★★★

  • 面试答案: 常见 Cache Aside:读缓存,未命中回源并回填;更新先改数据库,再删除对应缓存。
  • 底层原理: 并发写入与缓存重建可能短暂不一致,需要结合 TTL、重试、版本等机制。
  • 项目应用: 修改文章后使其缓存失效;关键业务始终以数据库为事实来源。

Q38|缓存穿透、击穿、雪崩区别? ★★

  • 面试答案: 穿透:访问不存在的数据;击穿:单个热点键失效;雪崩:大量键集中失效或缓存服务故障。
  • 底层原理: 三者都可能引发数据库流量激增,但触发方式不同。
  • 项目应用: 空值缓存/白名单;热点请求合并;TTL 抖动、限流与降级。

Q39|Redis 分布式锁怎么实现,有哪些风险? ★★★

  • 面试答案: 可用带随机唯一令牌和过期时间的 SET key token NX PX ttl 获取,释放时原子校验令牌后删除。
  • 底层原理: 锁可能因过期、暂停、故障切换失去互斥保证;关键资源还需 fencing token 或更强协调。
  • 项目应用: 防止定时任务多实例重复触发,但重要扣款逻辑不能只依赖缓存锁。

Q40|消息队列解决什么问题?如何处理重复消息? ★★★

  • 面试答案: 通过异步处理、削峰、解耦提高吞吐与响应效率;在至少一次投递下消费者要设计幂等。
  • 底层原理: 发布、消费、确认与重试可能重复或丢失,需要合理设置重试、死信队列与持久化策略。
  • 项目应用: 文章采集入队,后台 Worker 分类和去重;用唯一任务键避免重复处理。

08 · 操作系统 / Linux

进程线程、内存、死锁与排障 · 共 5 题

Q41|进程和线程有什么区别? ★

  • 面试答案: 进程是资源隔离和管理的重要单位;线程是调度执行的重要单位,同一进程的线程通常共享地址空间。
  • 底层原理: 线程共享数据易产生竞争;进程隔离更强但通信通常需要 IPC。
  • 项目应用: CPU 密集任务交给工作进程,I/O 密集任务可使用异步或线程池。

Q42|什么是虚拟内存? ★★

  • 面试答案: 虚拟内存为进程提供独立虚拟地址空间,由硬件和操作系统映射到物理内存或其他存储。
  • 底层原理: 支持内存隔离、按需分页、内存映射与共享;频繁换页会带来性能损失。
  • 项目应用: 分析 RSS、Swap、OOM 日志,区分内存泄漏与正常文件缓存。

Q43|什么是死锁,怎样避免? ★★

  • 面试答案: 多个执行单元形成循环等待,无法继续推进;经典必要条件包括互斥、请求并保持、不可剥夺、循环等待。
  • 底层原理: 统一锁顺序、缩短持锁时间、设置超时、捕获并重试可减少风险。
  • 项目应用: 两个数据库事务修改订单和库存时统一加锁顺序。

Q44|Linux CPU 100% 如何排查? ★★★

  • 面试答案: 确定持续时间和影响,定位占用最高的进程/线程,结合调用栈、日志、GC、流量及近期发布分析。
  • 底层原理: 高 CPU 可能是正常计算、死循环、GC 或流量峰值,不宜只靠重启掩盖问题。
  • 项目应用: top、ps aux --sort=-%cpu、pidstat -u 1、journalctl 逐步定位。

Q45|Linux 常见服务与网络排障命令有哪些? ★

  • 面试答案: ss -lntp 看监听端口;ps 查进程;top 看负载;free -h 看内存;df -h 看磁盘;curl -I 看响应;systemctl/journalctl 管理服务和日志。
  • 底层原理: 线上访问故障可能源自监听、反向代理、防火墙、应用报错或 DNS,不是单一因素。
  • 项目应用: 排查 502 时先确认应用端口和上游健康,再分析 Nginx 与业务日志。

09 · Web 安全

注入、跨站攻击、密码与权限 · 共 5 题

Q46|什么是 SQL 注入,如何防御? ★★

  • 面试答案: 攻击者将输入解释为 SQL 语法的一部分;使用预编译参数化查询或安全 ORM 接口,并约束动态列/表名。
  • 底层原理: 根因是数据与 SQL 指令边界不清,字符串转义不足以覆盖所有情况。
  • 项目应用: 查询用户时用占位符绑定参数,不直接拼接输入。

Q47|什么是 XSS,如何防御? ★★

  • 面试答案: 不可信内容被浏览器当可执行代码运行;采用上下文正确的输出编码、安全 DOM API、富文本清理与 CSP。
  • 底层原理: 不同 HTML/JS/URL 上下文需要不同处理策略,不能靠简单替换尖括号彻底解决。
  • 项目应用: 渲染文章摘要和评论时使用安全组件,对 HTML 白名单清理。

Q48|什么是 CSRF,如何防御? ★★

  • 面试答案: 攻击者利用浏览器自动携带用户凭据的行为诱导非预期状态变更;用 CSRF Token、SameSite、Origin 验证等措施。
  • 底层原理: Cookie 证明浏览器携带会话,不等于用户主动发起了操作;CORS 不是 CSRF 防护。
  • 项目应用: 删除文章、修改密码等操作校验 CSRF 令牌,不用 GET 执行状态变更。

Q49|用户密码应该如何存储? ★★

  • 面试答案: 保存专用慢哈希(首选考虑 Argon2id)及独立随机盐值,不保存明文或可逆密文。
  • 底层原理: 专用密码哈希通过内存/时间成本提高离线猜测代价;还应限速、做好会话安全和密码重置。
  • 项目应用: 注册时保存密码哈希,登录时使用安全校验库验证。

Q50|水平越权与垂直越权区别? ★★★

  • 面试答案: 水平越权:访问同权限层级别人的资源;垂直越权:低权限账户执行高权限操作。
  • 底层原理: 后端只校验“已登录”而不校验“能否操作此资源”就会暴露风险。
  • 项目应用: 订单接口校验 order.user_id == current_user.id 或明确的授权规则。

10 · Git / 测试 / 部署

版本管理、CI/CD、运行环境与观测 · 共 5 题

Q51|Git Merge 和 Rebase 区别? ★

  • 面试答案: Merge 合并分支并保留分叉历史;Rebase 将提交重新应用到新的基点,可能改变提交 ID。
  • 底层原理: 提交是不可变快照,Rebase 通过重建提交整理历史,可能影响已有共享分支。
  • 项目应用: 共享分支优先谨慎 Merge;个人未共享提交可以通过 Rebase 整理。

Q52|单元、集成、E2E 测试怎么区分? ★★

  • 面试答案: 单元测试验证独立逻辑;集成测试验证模块协作;E2E 测试验证真实用户链路。
  • 底层原理: 覆盖面越完整通常成本越高,故需要根据风险分层配置测试。
  • 项目应用: Vitest/Jest 测组件,Pytest 测 API,Playwright 测登录发布流程。

Q53|CI/CD 是什么? ★★

  • 面试答案: CI 自动进行构建、检查和测试;CD 将通过验证的版本持续交付或自动部署。
  • 底层原理: 自动化降低手工操作差异,发布流程应包含环境区分、凭据管理、回滚与检查。
  • 项目应用: GitHub Actions 上运行 lint → test → build → deploy。

Q54|Nginx 与 Docker 分别解决什么问题? ★★

  • 面试答案: Nginx 是 Web 服务与反向代理,可做 TLS 终止、静态资源和负载均衡;Docker 打包应用与依赖,并提供进程级容器隔离。
  • 底层原理: 前者是入口与转发组件,后者是交付和运行环境技术,可单独使用或组合。
  • 项目应用: Nginx 将 /api 转发给后端;后端可使用 Docker 或 systemd 部署。

Q55|生产环境故障如何定位? ★★★

  • 面试答案: 先评估影响与回滚可能性,再查监控指标、日志、链路追踪、近期变更,定位并验证根因。
  • 底层原理: Metrics 反映趋势,Logs 解释事件,Traces 定位跨服务耗时;不能盲目重启。
  • 项目应用: 定位接口 P95 延迟升高来自慢 SQL、连接池耗尽还是外部服务。

11 · 系统设计 / 项目经验

架构、限流、文件上传、扩展与选型 · 共 5 题

Q56|如何设计一个完整资讯网站? ★★★

  • 面试答案: 划分前端展示、API 服务、关系型数据库、热点缓存、后台采集/处理任务与部署监控等职责。
  • 底层原理: 同步请求负责快速响应,耗时处理异步化;数据库保存事实数据,缓存只是加速层。
  • 项目应用: 资讯采集→去重→入库→分类→API→页面展示,并加入监控、失败重试。

Q57|如何设计 API 限流? ★★★

  • 面试答案: 常见固定窗口、滑动窗口、令牌桶与漏桶;根据目标选择平均速率、突发容量与计算成本。
  • 底层原理: 例如令牌桶以固定速率补充令牌,允许一定突发,超过配额则拒绝或排队。
  • 项目应用: 登录、搜索和大模型接口按 IP/账号/API Key 限流,超限返回 429。

Q58|如何设计安全文件上传? ★★

  • 面试答案: 校验认证和权限,限制大小、数量与内容类型,检查文件签名,安全存储、重命名并执行后续处理。
  • 底层原理: 扩展名与客户端 MIME 不可信;存储路径与可执行权限必须隔离。
  • 项目应用: 用户上传图片后存到对象存储,后台生成缩略图,返回受控访问地址。

Q59|网站访问量上升时如何优化? ★★★

  • 面试答案: 先测量瓶颈,再从静态资源、缓存、API、数据库索引、连接池、后台任务、扩容等方面选择方案。
  • 底层原理: 网络、CPU、数据库或第三方 API 都可能成为瓶颈;在没有指标时盲目加缓存/拆微服务可能适得其反。
  • 项目应用: 用 RUM/APM、慢 SQL、P95 延迟和错误率决定最有收益的改进。

Q60|单体架构与微服务何时选择? ★★★

  • 面试答案: 单体作为统一部署单元,维护和测试相对简单;微服务独立部署,适合更明确的业务/团队边界,但有分布式复杂度。
  • 底层原理: 服务拆分引入网络调用、数据一致性、运维、可观测性等成本。
  • 项目应用: 个人开发者或小团队优先模块化单体,规模和组织需求明确后再拆分。

关键代码与原理速记

1. JavaScript 事件循环输出顺序

console.log(1);
setTimeout(() => console.log(4), 0);
Promise.resolve().then(() => console.log(3));
console.log(2);
// 1, 2, 3, 4

要点:同步执行后先处理微任务,再进入后续任务(在典型浏览器环境下)。

2. 异步请求并发

const [user, articles] = await Promise.all([
  fetchUser(),
  fetchArticles(),
]);

要点:独立任务可并发;需要考虑失败处理、超时、取消及限流。

3. 参数化 SQL 与查询计划

cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
EXPLAIN SELECT id, title
FROM articles
WHERE user_id = 100
ORDER BY published_at DESC
LIMIT 20;

要点:先测量执行计划再调整索引;参数化数据值、动态列名做白名单限制。

4. 乐观锁防止更新覆盖

UPDATE documents
SET content = :new_content, version = version + 1
WHERE id = :id AND version = :expected_version;

要点:影响行数为 0 可能发生冲突,应用应重读并向用户提示或重试。

5. 从浏览器到数据库的常见链路

用户交互 → 前端框架 → HTTPS → 反向代理 → API 中间件
                                        ↓
                      身份认证 / 参数校验 / 业务逻辑
                                        ↓
                                 数据库 / 缓存
                                        ↓
                  JSON 响应 → 前端状态更新 → UI 渲染

注意:这是常见架构示例,不要求每个项目必须部署 Redis、微服务或 Docker。

高频必背题(优先复习)

  • [ ] Q09 事件循环与微任务
  • [ ] Q10 Promise 与 async/await
  • [ ] Q13 React key 与组件复用
  • [ ] Q17 TCP 三次握手
  • [ ] Q20 HTTP / HTTPS
  • [ ] Q21 CORS 与同源策略
  • [ ] Q25 Session 与 JWT
  • [ ] Q28 后端接口幂等
  • [ ] Q29 B+ 树索引
  • [ ] Q30 联合索引
  • [ ] Q31 ACID
  • [ ] Q32 MVCC 与隔离级别
  • [ ] Q33 SQL 优化
  • [ ] Q38 缓存击穿、穿透、雪崩
  • [ ] Q44 Linux CPU 排障
  • [ ] Q46 SQL 注入
  • [ ] Q47 XSS / Q48 CSRF
  • [ ] Q50 越权校验
  • [ ] Q55 生产故障定位
  • [ ] Q56 系统架构设计

四周复习计划

周次 重点模块 练习目标 完成
第 1 周 01–03 前端、JS、TS、React/Vue 能解释状态管理、渲染与事件循环,完成一个交互页 - [ ]
第 2 周 04–05、08 网络、API、Linux 能设计 CRUD API,并用命令定位常见线上故障 - [ ]
第 3 周 06–07、09 数据库、Redis、安全 能分析执行计划、编写事务并处理权限问题 - [ ]
第 4 周 10–11 工程化、系统设计 配置自动测试/部署并完成一场模拟项目面试 - [ ]

答题模板与自检

面试口述推荐四步:定义 → 原理 → 真实应用 → 方案限制。

例如“为什么使用 Redis”:

当数据读多写少、重复访问频繁且数据库出现读取压力时,我会考虑在数据库前加入 Redis 旁路缓存。读取先查缓存,未命中回源;更新先写数据库,再删除相应缓存。这样可以降低数据库负载,但会增加数据一致性和运维复杂度。规模较小的项目我会先检查数据库索引和实际延迟,不会为了技术栈而强行引入缓存。

每个知识点检查自己是否可以:

  • [ ] 不看笔记,30–90 秒讲明白定义和原理。
  • [ ] 写出一段最小代码、SQL 或架构示意。
  • [ ] 描述至少一个真实项目场景。
  • [ ] 指出该技术的适用边界、代价或常见误区。

八股文之外必须补齐

  1. 算法: 数组、哈希表、双指针、链表、二叉树、二分、递归、动态规划基础。
  2. SQL: JOIN、GROUP BY、子查询、窗口函数、事务与索引。
  3. 框架专项: 选定一个前端框架和一个后端框架,深入生命周期、路由、验证、错误处理。
  4. 工程实践: 能独立开发、测试、部署并定位线上问题。
  5. 项目表达: 能解释需求、架构选择、故障、技术权衡和改进效果。

建议原则:对全栈岗位,优先打通一套实际技术栈(如 TypeScript + React + Node.js + PostgreSQL),再横向扩展其他框架。


整理范围: 基于本次对话已经讲解的 60 道题,按知识模块复写为便于检索与复习的 Markdown。

[ COMMENTS / 0 ]

[ empty ] no comments yet.