系统设计(架构与设计方法论)
从架构原则、领域建模到微服务与高并发,面向后端面试与实战的"判断框架优先、具体模式其次"的系统设计方法论合集。
一、系列定位
1.1 与既有笔记的边界
本系列定位为方法论与决策层,刻意与既有的组件用法类笔记互补、不重复:
| 既有笔记 | 讲什么 | 本系列的补充 |
|---|---|---|
| SpringCloud微服务 | Nacos / Gateway / Sentinel / Seata 等组件的安装、配置、API 用法 | 为什么要拆、何时不该拆、通信与一致性模式的取舍逻辑 |
| 消息队列 | MQ 产品特性与使用 | MQ 在削峰、异步化、最终一致性中的系统级定位 |
| Redis、MySQL深入 | 中间件能力与调优 | 缓存体系决策、读写分离与分库分表决策树 |
阅读约定:凡是"如何配置某个组件"都指向上述组件笔记,本系列只回答"选哪个、为什么、边界在哪、如何判断"。
1.2 阅读顺序建议
- 先读《设计原则与架构演进》建立全局观;
- 再读《DDD领域驱动设计》理解领域建模与边界;
- 然后读《微服务架构与拆分》把边界落成服务;
- 《高并发系统设计》与《经典系统设计案例》解决性能与容量问题,两者可对照阅读;
- 面试前用本篇尾部的题单自测。
二、系列覆盖表
| 文件 | 一句话定位 | 关键交付物 |
|---|---|---|
| 设计原则与架构演进 | 架构层如何理解设计原则,单体到平台化的演进逻辑与代价 | 演进决策对照表、过度设计信号清单 |
| DDD领域驱动设计 | 用战略设计与战术设计把复杂业务建模成可落地的代码边界 | 电商订单模块包结构与充血模型示例代码 |
| 微服务架构与拆分 | 拆分方法论、通信/注册中心/网关选型与分布式事务模式取舍 | 拆分决策树、一致性模式对比表 |
| 高并发系统设计 | 容量评估与分层防护的完整方法论 | 通用 8 步设计法、四保护策略指标表 |
| 经典系统设计案例 | 短链、秒杀、Feed、IM 四个端到端案例 | 4 张架构图、分布式 ID 与限流算法附表 |
| 容量估算与压测 | 日活怎么换 QPS、存储带宽怎么估、压测怎么找拐点 | 容量规划表、单机能力参考表 |
| 缓存架构设计 | 多级缓存的层次、四种缓存模式、三 Problem 解法、一致性取舍 | 一致性方案对比、热点/大 key 治理清单 |
| 异步与消息架构 | 何时该异步、四种模型、选型、事务消息与本地消息表、延迟消息 | 可靠性三件事、积压处理决策表 |
| API 设计与网关 | REST 契约、版本化、幂等键、鉴权对比、网关五职责、灰度 | 幂等实现模板、接口十条检查 |
| 分布式一致性与事务 | 六种分布式事务方案对比与选型决策树 | 决策树、对账兜底设计 |
三、文章导航
- 设计原则与架构演进:单一职责、开闭、依赖倒置在架构层的投影,以及单体到中台化的演进驱动与代价。
- DDD领域驱动设计:限界上下文与聚合建模,贫血 vs 充血模型,附电商订单 DDD 落地代码骨架。
- 微服务架构与拆分:从四个视角拆服务,服务间通信与基础设施选型,分布式事务模式取舍与"何时不该上微服务"。
- 高并发系统设计:容量评估、分层防护、缓存与异步化决策,隔离/熔断/降级/限流选型,附通用 8 步设计法。
- 经典系统设计案例:短链、秒杀、Feed、IM 四案例端到端拆解,附分布式 ID 与限流算法对比表。
- 容量估算与压测:从日活推峰值 QPS、存储与带宽估算、阶梯加压找拐点,附可直接套用的容量规划表。
- 缓存架构设计:缓存放哪一层、四种模式怎么选、穿透/击穿/雪崩与一致性方案、热点与大 key 治理。
- 异步与消息架构:该不该异步、四种消息模型、中间件选型、事务消息与本地消息表、延迟消息与积压处理。
- API 设计与网关:接口契约与错误体、版本化、幂等键实现、鉴权方式对比、网关的五项职责与灰度。
- 分布式一致性与事务:2PC/TCC/Saga/本地消息表/事务消息/最大努力通知六种方案对比与选型决策树。
四、学完可回答的系统设计面试题
- 说说架构演进通常经历哪几个阶段?每一步的驱动因素和代价是什么?如何判断自己该不该走到微服务?
- 单一职责原则在模块/服务层面怎么落地?拆服务和拆类有什么不同的判断标准?
- 什么是限界上下文?它和微服务边界是什么关系?如何用 DDD 指导一次服务拆分?
- 贫血模型和充血模型有什么区别?为什么实际项目里贫血模型这么多?如何渐进改进?
- 拆分微服务有哪些方法(按业务能力 / 子域 / 团队 / 变更频率)?如何评估拆分的粒度是否合适?
- 服务间通信选同步还是异步?什么时候必须用 MQ?消息带来的重复、乱序、丢消息怎么兜底?
- 对比 2PC、TCC、SAGA、本地消息表、事务消息的适用场景,电商下单一般怎么选?如何尽量避免分布式事务?
- 如何估算一个系统的 QPS 并推导容量?压测目标怎么定?
- 缓存穿透、击穿、雪崩分别怎么防?缓存与数据库的一致性如何取舍?
- 熔断、降级、限流、隔离各自的适用场景与关键指标是什么?秒杀场景为什么要"本地标记 + MQ 削峰 + 库存预扣"?
- 短链系统用哈希还是发号器?跳转链路和过期清理如何设计?
- 设计一个高可用 IM 或 Feed 流系统,消息可靠性(不丢不重不乱序)如何保证?
- 分布式 ID 有哪些生成方案?为什么很多系统选雪花算法,它的时钟回拨问题怎么处理?
Cao Note