Skip to content

全栈面试:系统设计

系统设计题怎么回答?

建议按这个结构:

  1. 明确需求和边界。
  2. 估算规模。
  3. 设计核心数据模型。
  4. 设计 API。
  5. 画出核心架构。
  6. 说明关键流程。
  7. 讨论性能、缓存、安全、监控和扩展。

不要一上来就画复杂架构。先问清楚业务目标和约束。

如何设计一个短链接系统?

核心需求:

  • 长链接转短链接
  • 短链接跳转
  • 防重复
  • 访问统计
  • 过期时间

关键点:

  • 生成短码,可以用自增 ID 转 Base62,也可以随机生成并去重。
  • 数据库存储短码、长链接、创建人、过期时间。
  • 跳转接口要高性能,可以加缓存。
  • 统计可以异步写入日志或消息队列。

常见追问:如何避免短码冲突?如何处理热点链接?如何统计 PV/UV?

如何设计一个登录系统?

核心模块:

  • 注册
  • 登录
  • 密码加密存储
  • token 或 session
  • refresh token
  • 权限校验
  • 找回密码
  • 登录失败限流

关键安全点:

  • 密码不能明文存储。
  • 使用 HTTPS。
  • 登录失败要限流。
  • token 泄露要能失效。
  • 敏感操作需要二次验证。

如何设计文件上传?

常见流程:

  1. 前端选择文件并校验大小和类型。
  2. 请求后端获取上传凭证。
  3. 上传到对象存储或后端服务。
  4. 后端保存文件 metadata。
  5. 返回文件访问地址。

大文件上传可以考虑:

  • 分片上传
  • 断点续传
  • 秒传
  • 上传进度
  • 文件 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

共享表方案成本低,但每个查询都必须带租户条件,并做好权限校验和索引设计。高安全要求的企业客户可以使用独立库或独立部署。

如何从单体演进到微服务?

不要一开始就为了微服务而微服务。更稳妥的路线是先把单体内部模块边界理清,提取清晰接口,再按业务边界拆出服务。

拆分时要考虑数据库边界、接口契约、服务发现、配置、日志、链路追踪、部署和故障隔离。面试时可以强调:微服务解决团队协作和独立扩展问题,也会带来分布式复杂度。

Built with VitePress and GitHub Pages.