全栈面试:系统设计
系统设计题怎么回答?
建议按这个结构:
- 明确需求和边界。
- 估算规模。
- 设计核心数据模型。
- 设计 API。
- 画出核心架构。
- 说明关键流程。
- 讨论性能、缓存、安全、监控和扩展。
不要一上来就画复杂架构。先问清楚业务目标和约束。
如何设计一个短链接系统?
核心需求:
- 长链接转短链接
- 短链接跳转
- 防重复
- 访问统计
- 过期时间
关键点:
- 生成短码,可以用自增 ID 转 Base62,也可以随机生成并去重。
- 数据库存储短码、长链接、创建人、过期时间。
- 跳转接口要高性能,可以加缓存。
- 统计可以异步写入日志或消息队列。
常见追问:如何避免短码冲突?如何处理热点链接?如何统计 PV/UV?
如何设计一个登录系统?
核心模块:
- 注册
- 登录
- 密码加密存储
- token 或 session
- refresh token
- 权限校验
- 找回密码
- 登录失败限流
关键安全点:
- 密码不能明文存储。
- 使用 HTTPS。
- 登录失败要限流。
- token 泄露要能失效。
- 敏感操作需要二次验证。
如何设计文件上传?
常见流程:
- 前端选择文件并校验大小和类型。
- 请求后端获取上传凭证。
- 上传到对象存储或后端服务。
- 后端保存文件 metadata。
- 返回文件访问地址。
大文件上传可以考虑:
- 分片上传
- 断点续传
- 秒传
- 上传进度
- 文件 hash 校验
安全点:文件类型校验、病毒扫描、访问权限、私有桶、防盗链。
如何设计消息通知系统?
常见通知类型:
- 站内信
- 邮件
- 短信
- WebSocket 实时通知
- Push
设计点:
- 通知模板
- 用户订阅设置
- 消息队列削峰
- 失败重试
- 已读未读状态
- 频率限制
如果是实时协作或 IM,可以使用 WebSocket;如果只是异步通知,队列和站内信就够了。
如何设计一个搜索功能?
简单场景可以用数据库 LIKE 或全文索引。
复杂场景可以用搜索引擎,比如 Elasticsearch。
设计点:
- 数据同步
- 分词
- 排序
- 高亮
- 过滤条件
- 权限过滤
- 拼写纠错
- 热门搜索
如果是 AI 知识库搜索,还可以结合向量检索和 rerank。
如何设计日志和监控?
常见观测内容:
- 请求量
- 错误率
- 延迟
- CPU、内存、磁盘
- 数据库慢查询
- 缓存命中率
- 队列堆积
- 前端错误
- 用户行为
关键是每个请求有 requestId,方便从前端、网关、后端、数据库日志串起来排查。
系统设计中的缓存怎么用?
缓存适合读多写少、计算成本高、允许短暂不一致的场景。
常见缓存层:
- 浏览器缓存
- CDN
- 网关缓存
- 应用内存缓存
- Redis
需要考虑:
- 过期策略
- 缓存一致性
- 热点 key
- 缓存穿透
- 缓存雪崩
- 数据更新后如何失效
系统设计面试追问
如何设计博客系统?
博客系统可以从文章、分类、标签、用户、评论和后台管理几个模块拆解。核心表包括文章表、分类表、标签表、文章标签关联表、用户表和评论表。
重点要考虑草稿与发布状态、Markdown 渲染、SEO、搜索、权限、图片上传和静态化。访问量高时可以用 CDN、页面缓存、增量构建或 SSG 提升速度。
如何设计评论系统?
评论系统要先确定是否支持楼中楼、审核、点赞、删除和举报。数据结构通常包含评论 ID、文章 ID、用户 ID、父评论 ID、内容、状态和时间。
关键风险是垃圾评论、XSS、敏感词和刷评论。工程上要做内容过滤、登录限制、频率限制、审核状态和通知机制。
如何设计权限系统?
常见方案是 RBAC:用户绑定角色,角色绑定权限,权限对应菜单、按钮或接口。后台管理系统通常还会区分组织、部门、租户和数据范围。
前端根据权限控制菜单和按钮,后端必须在接口层做最终校验。面试时可以补充:权限变更后要考虑缓存失效和登录态刷新。
如何设计秒杀系统?
秒杀系统核心目标是抗高并发、防超卖和保护下游服务。常见方案是前端静态化、CDN、限流、排队、库存预热到 Redis、原子扣减、异步下单。
真正落库可以通过消息队列削峰。还要考虑防刷、幂等、订单超时关闭和库存回补。回答时不要只说加缓存,要说清楚库存一致性和失败补偿。
如何设计在线文档协作?
在线协作的核心是多人同时编辑的一致性。常见技术思路有 OT 或 CRDT,用来合并不同用户的操作。
系统层面需要文档存储、操作日志、实时通道、版本快照、权限控制和冲突恢复。简单业务可以先做“编辑锁 + 自动保存”,复杂场景再引入实时协同算法。
如何设计任务队列?
任务队列适合异步处理耗时或不需要立即完成的任务,例如发邮件、生成报表、图片处理、消息推送。核心模型包括任务生产者、队列、消费者、重试、死信队列和监控。
要重点考虑幂等、失败重试、超时、任务优先级和积压告警。面试时可以说:队列能削峰解耦,但会引入最终一致性问题。
如何设计多租户系统?
多租户系统要保证不同租户的数据隔离。常见方案有独立数据库、共享数据库独立 schema、共享表加 tenant_id。
共享表方案成本低,但每个查询都必须带租户条件,并做好权限校验和索引设计。高安全要求的企业客户可以使用独立库或独立部署。
如何从单体演进到微服务?
不要一开始就为了微服务而微服务。更稳妥的路线是先把单体内部模块边界理清,提取清晰接口,再按业务边界拆出服务。
拆分时要考虑数据库边界、接口契约、服务发现、配置、日志、链路追踪、部署和故障隔离。面试时可以强调:微服务解决团队协作和独立扩展问题,也会带来分布式复杂度。