程序员如何做「系统设计」:从需求到架构
系统设计是程序员从写代码到设计系统的跨越。
会写代码是基础,能设计系统才能解决更大的问题。
一、系统设计的层次
1. 单体应用设计
一个应用怎么组织,模块之间怎么交互。
2. 分布式系统设计
多个服务怎么协同,数据怎么同步。
3. 大规模系统设计
如何支撑海量请求,高可用怎么实现。
二、系统设计的步骤
1. 需求分析
- 功能需求:系统要做什么
- 非功能需求:性能、可用性、扩展性
- 约束条件:时间、资源、技术栈
2. 容量预估
- 用户量、请求量
- 数据量、存储量
- 带宽、QPS
3. 架构设计
- 高层架构:分多少层、多少服务
- 数据存储:用什么数据库、怎么分库分表
- 缓存策略:哪些要缓存、缓存在哪里
- 异步处理:哪些可以异步、怎么异步
4. 详细设计
- 接口设计
- 数据模型
- 核心流程
5. 权衡取舍
- CAP 理论
- 一致性 vs 可用性
- 复杂度 vs 可维护性
三、系统设计的常见模式
1. 分层架构
- 接入层 → 业务层 → 数据层
- 清晰、简单、易维护
2. 微服务架构
- 服务拆分、独立部署
- 适合大型团队、复杂业务
3. 事件驱动架构
- 生产者 → 消息队列 → 消费者
- 解耦、异步、高扩展
4. CQRS
- 命令查询分离
- 读和写可以分别优化
四、系统设计的关键问题
1. 可用性
- 多副本
- 故障转移
- 熔断降级
2. 一致性
- 强一致 vs 最终一致
- 主从同步
- 分布式事务
3. 扩展性
- 水平扩展 vs 垂直扩展
- 无状态服务
- 分库分表
4. 性能
- 缓存
- 异步
- 索引
五、一句话总结
系统设计 = 需求分析 + 容量预估 + 架构设计 + 权衡取舍,核心是在约束条件下找到最优解。