# 系统设计方法论 ## 问题 1. 系统设计的核心原则是什么? 2. 如何进行需求分析? 3. 如何估算系统容量? 4. 数据模型设计有哪些最佳实践? 5. 如何设计高可用架构? --- ## 标准答案 ### 1. 系统设计原则 **核心原则**: 1. **简单性**(KISS:Keep It Simple, Stupid) 2. **模块化**(高内聚、低耦合) 3. **可扩展性**(水平扩展、垂直扩展) 4. **高可用性**(冗余、故障隔离) 5. **一致性**(CAP 理论权衡) --- ### 2. 需求分析 **功能需求**: - 系统做什么? - 用户角色有哪些? - 核心流程是什么? **非功能需求**: - **性能**:QPS、响应时间 - **可用性**:99.9%、99.99%、99.999% - **扩展性**:支持多少用户 - **安全性**:认证、授权、加密 - **一致性**:强一致、最终一致 --- ### 3. 容量估算 **QPS 估算**: ``` 日活用户(DAU):100 万 平均每人每天请求:20 次 总 QPS = 100 万 × 20 / 86400 ≈ 231 QPS 峰值 QPS = 231 × 5 ≈ 1155 QPS(假设峰值是平均的 5 倍) ``` **存储估算**: ``` 用户数:100 万 每人平均数据:1 KB 总存储 = 100 万 × 1 KB ≈ 1 GB 每年增长 = 1 GB × 12 = 12 GB ``` **带宽估算**: ``` 平均响应大小:10 KB QPS:1000 带宽 = 1000 × 10 KB × 8 = 80 Mbps ``` --- ### 4. 数据模型设计 **原则**: 1. **范式化**(减少冗余) 2. **反范式化**(提高性能) 3. **分区**(水平、垂直) 4. **索引**(加速查询) **示例**: ```sql -- 范式化(3NF) CREATE TABLE users ( id BIGINT PRIMARY KEY, name VARCHAR(50), email VARCHAR(100) ); CREATE TABLE orders ( id BIGINT PRIMARY KEY, user_id BIGINT, amount DECIMAL(10,2), created_at DATETIME, FOREIGN KEY (user_id) REFERENCES users(id) ); -- 反范式化(冗余用户名,避免 JOIN) CREATE TABLE orders_denormalized ( id BIGINT PRIMARY KEY, user_id BIGINT, user_name VARCHAR(50), -- 冗余 amount DECIMAL(10,2), created_at DATETIME ); ``` --- ### 5. 高可用架构 **冗余设计**: ``` ┌─────────────┐ │ 负载均衡 │ (Nginx、HAProxy) └──────┬──────┘ │ ┌─────────┼─────────┐ │ │ │ ┌──▼──┐ ┌──▼──┐ ┌──▼──┐ │App 1│ │App 2│ │App 3│ └──┬──┘ └──┬──┘ └──┬──┘ │ │ │ └─────────┼─────────┘ │ ┌──────▼──────┐ │ 主从数据库 │ │ Master │ │ Slave │ └─────────────┘ ``` **故障隔离**: - 熔断器(Circuit Breaker) - 限流(Rate Limiter) - 降级(Fallback) - 舱舱模式(Bulkhead) --- ### 6. 扩展性设计 **垂直扩展(Scale Up)**: - 升级硬件(CPU、内存、磁盘) - 简单、快速 - 有上限(硬件限制) **水平扩展(Scale Out)**: - 增加机器数量 - 无限扩展 - 需要架构支持(无状态、数据分片) --- ### 7. 阿里 P7 加分项 **架构思维**: - 能进行技术选型(权衡各种方案) - 能进行容量规划(预估资源需求) - 能进行成本控制(性价比优化) **设计能力**: - 能设计高并发架构 - 能设计高可用架构 - 能设计可扩展架构 **沟通能力**: - 能清晰地表达设计方案 - 能进行技术方案评审 - 能推动方案落地