Skip to content

系统设计面试题

1. 系统设计的基本概念

问题:什么是系统设计?

答案

  • 系统设计:设计满足功能需求和非功能需求的系统架构。
  • 设计目标
    • 可扩展性
    • 可靠性
    • 可用性
    • 可维护性
    • 安全性

2. 系统设计的步骤

问题:系统设计的步骤有哪些?

答案

  • 需求分析:明确功能需求和非功能需求。
  • 架构设计:设计系统架构。
  • 详细设计:设计各个组件。
  • 技术选型:选择合适的技术栈。
  • 实现:编码实现。
  • 测试:测试系统。
  • 部署:部署系统。
  • 运维:运维系统。

3. 系统设计的原则

问题:系统设计的原则有哪些?

答案

  • 简单性:保持系统简单。
  • 模块化:将系统分解为模块。
  • 高内聚低耦合:模块内部高内聚,模块之间低耦合。
  • 可扩展性:系统可以扩展。
  • 可维护性:系统易于维护。
  • 可靠性:系统可靠。
  • 可用性:系统可用。
  • 安全性:系统安全。

4. 系统设计的评估指标

问题:系统设计的评估指标有哪些?

答案

  • 性能指标
    • 响应时间
    • 吞吐量
    • 并发用户数
  • 可靠性指标
    • 可用性
    • 故障恢复时间
    • 数据一致性
  • 可扩展性指标
    • 水平扩展能力
    • 垂直扩展能力
  • 安全性指标
    • 数据安全
    • 访问控制
    • 审计日志

5. 系统设计的架构模式

问题:常用的系统架构模式有哪些?

答案

  • 分层架构
    • 表现层
    • 业务逻辑层
    • 数据访问层
  • 微服务架构
    • 服务拆分
    • 服务治理
  • 事件驱动架构
    • 事件发布
    • 事件订阅
  • CQRS架构
    • 命令查询分离
    • 读写分离

6. 系统设计的技术选型

问题:如何进行技术选型?

答案

  • 考虑因素
    • 业务需求
    • 团队技术栈
    • 社区支持
    • 性能
    • 可维护性
  • 选型原则
    • 选择成熟的技术
    • 选择团队熟悉的技术
    • 选择社区活跃的技术
    • 选择性能满足需求的技术

7. 系统设计的数据库设计

问题:如何设计数据库?

答案

  • 数据库选型
    • 关系型数据库:MySQL、PostgreSQL
    • NoSQL数据库:MongoDB、Redis
  • 表结构设计
    • 遵循数据库范式
    • 选择合适的数据类型
    • 设计合适的索引
  • 分库分表
    • 水平分表
    • 垂直分表
    • 水平分库
    • 垂直分库

8. 系统设计的缓存设计

问题:如何设计缓存?

答案

  • 缓存类型
    • 本地缓存:Guava Cache、Caffeine
    • 分布式缓存:Redis、Memcached
  • 缓存策略
    • Cache Aside:旁路缓存
    • Read Through:读穿透
    • Write Through:写穿透
    • Write Behind:写回
  • 缓存更新
    • 先更新数据库,再删除缓存
    • 延时双删
    • 订阅Binlog

9. 系统设计的消息队列设计

问题:如何设计消息队列?

答案

  • 消息队列选型
    • Kafka:高吞吐量
    • RocketMQ:事务消息
    • RabbitMQ:可靠性高
  • 消息模型
    • 点对点模型
    • 发布订阅模型
  • 消息可靠性
    • 消息持久化
    • 消息确认
    • 消息重试

10. 系统设计的负载均衡设计

问题:如何设计负载均衡?

答案

  • 负载均衡策略
    • 轮询
    • 随机
    • 最少连接
    • 加权轮询
    • 一致性哈希
  • 负载均衡工具
    • Nginx
    • HAProxy
    • Ribbon
    • Spring Cloud LoadBalancer

11. 系统设计的限流设计

问题:如何设计限流?

答案

  • 限流算法
    • 固定窗口算法
    • 滑动窗口算法
    • 令牌桶算法
    • 漏桶算法
  • 限流维度
    • IP限流
    • 用户限流
    • 接口限流
    • 系统限流
  • 限流工具
    • Sentinel
    • Guava RateLimiter
    • Redis + Lua

12. 系统设计的熔断设计

问题:如何设计熔断?

答案

  • 熔断状态
    • 关闭状态
    • 开启状态
    • 半开状态
  • 熔断条件
    • 失败率
    • 慢调用比例
    • 异常数
  • 熔断实现
    • Hystrix
    • Resilience4j
    • Sentinel

13. 系统设计的降级设计

问题:如何设计降级?

答案

  • 降级类型
    • 自动降级
    • 手动降级
  • 降级策略
    • 返回默认值
    • 返回缓存数据
    • 返回友好提示
    • 跳转到降级页面
  • 降级实现
    • Hystrix
    • Resilience4j
    • Sentinel

14. 系统设计的分布式事务设计

问题:如何设计分布式事务?

答案

  • 2PC(两阶段提交)
    • 准备阶段
    • 提交阶段
  • TCC(Try-Confirm-Cancel)
    • Try:预留资源
    • Confirm:确认执行
    • Cancel:取消执行
  • SAGA
    • 补偿事务
    • 长事务解决方案
  • 本地消息表
    • 基于消息的最终一致性
  • 事务消息
    • 使用RocketMQ等消息中间件的事务消息

15. 系统设计的分布式锁设计

问题:如何设计分布式锁?

答案

  • Redis分布式锁
    • SETNX + EXPIRE
    • Redlock算法
  • Zookeeper分布式锁
    • 临时顺序节点
    • Watcher机制
  • 数据库分布式锁
    • 唯一索引
    • 乐观锁

16. 系统设计的分布式ID设计

问题:如何设计分布式ID?

答案

  • UUID:全局唯一,无序,长度较长。
  • Snowflake:Twitter开源的分布式ID生成算法。
  • 数据库自增:单机自增,分布式需要分段。
  • Redis INCR:基于Redis的INCR命令。
  • Zookeeper:基于Zookeeper的顺序节点。

17. 系统设计的监控设计

问题:如何设计监控?

答案

  • 监控指标
    • 应用性能监控(APM)
    • 基础设施监控
    • 业务监控
  • 监控工具
    • Prometheus + Grafana
    • SkyWalking
    • Zipkin
    • Jaeger
  • 告警策略
    • 设置告警阈值
    • 多级告警
    • 告警通知

18. 系统设计的日志设计

问题:如何设计日志?

答案

  • 日志级别
    • DEBUG
    • INFO
    • WARN
    • ERROR
  • 日志格式
    • 时间戳
    • 日志级别
    • 线程名
    • 类名
    • 日志信息
  • 日志收集
    • ELK(Elasticsearch + Logstash + Kibana)
    • EFK(Elasticsearch + Fluentd + Kibana)
    • Loki

19. 系统设计的案例:设计短链接系统

问题:如何设计短链接系统?

答案

  • 功能需求
    • 生成短链接
    • 重定向到长链接
  • 非功能需求
    • 高可用
    • 高性能
    • 可扩展
  • 架构设计
    • 使用哈希算法生成短链接
    • 使用Redis缓存短链接
    • 使用数据库存储短链接
    • 使用CDN加速访问

20. 系统设计的案例:设计秒杀系统

问题:如何设计秒杀系统?

答案

  • 功能需求
    • 商品展示
    • 秒杀下单
    • 订单支付
  • 非功能需求
    • 高并发
    • 高可用
    • 数据一致性
  • 架构设计
    • 前端优化:静态资源CDN、页面静态化、按钮置灰
    • 后端优化:限流、降级、熔断、缓存、异步、消息队列
    • 数据库优化:分库分表、读写分离、使用Redis预减库存

21. 系统设计的案例:设计微博系统

问题:如何设计微博系统?

答案

  • 功能需求
    • 发布微博
    • 关注用户
    • 查看微博
    • 点赞评论
  • 非功能需求
    • 高并发
    • 高可用
    • 可扩展
  • 架构设计
    • 使用Redis缓存热门微博
    • 使用消息队列异步处理
    • 使用分库分表存储微博
    • 使用Elasticsearch搜索微博

22. 系统设计的案例:设计聊天系统

问题:如何设计聊天系统?

答案

  • 功能需求
    • 发送消息
    • 接收消息
    • 离线消息
  • 非功能需求
    • 实时性
    • 高可用
    • 可扩展
  • 架构设计
    • 使用WebSocket实现实时通信
    • 使用消息队列存储消息
    • 使用Redis存储在线用户
    • 使用分库分表存储消息

23. 系统设计的案例:设计推荐系统

问题:如何设计推荐系统?

答案

  • 功能需求
    • 用户画像
    • 物品画像
    • 推荐算法
  • 非功能需求
    • 实时性
    • 准确性
    • 可扩展
  • 架构设计
    • 使用大数据技术处理数据
    • 使用机器学习算法训练模型
    • 使用Redis缓存推荐结果
    • 使用A/B测试优化推荐效果

24. 系统设计的案例:设计支付系统

问题:如何设计支付系统?

答案

  • 功能需求
    • 创建订单
    • 支付订单
    • 退款订单
  • 非功能需求
    • 高可用
    • 数据一致性
    • 安全性
  • 架构设计
    • 使用分布式事务保证数据一致性
    • 使用消息队列异步处理
    • 使用数据库分库分表
    • 使用限流保护系统

25. 系统设计的最佳实践

问题:系统设计最佳实践有哪些?

答案

  • 从简单开始,逐步演进。
  • 遵循系统设计的原则。
  • 选择合适的技术栈。
  • 设计高可用系统。
  • 设计可扩展系统。
  • 设计可维护系统。
  • 设计安全系统。
  • 进行充分的测试。
  • 监控系统运行状态。
  • 持续优化系统。