第8讲:架构设计练习题库
核心结论(5条必记)
- 刷题不是目的,理解原理才是 -- 每道题要能说出原理、方案、权衡,不要死记硬背
- 画架构图是基本功 -- 每道题都画架构图,标注核心组件和数据流向
- 准备3个完整案例 -- 从背景、复杂度、方案、效果完整讲述
- 模拟面试很重要 -- 找朋友模拟面试,练习表达和画图
- 持续学习新技术 -- 架构技术在演进,保持学习心态
一、架构思维练习
1. 架构 vs 框架 vs 设计模式
问题: 请解释架构、框架、设计模式的区别,并举例说明。
参考答案:
- 架构:系统整体结构,如微服务架构
- 框架:代码结构,如Spring MVC框架
- 设计模式:类和对象关系,如单例模式
练习:
- [ ] 画出三层架构图
- [ ] 画出微服务架构图
- [ ] 举例说明一个设计模式
2. 架构设计三原则
问题: 请解释架构设计的三个原则,并举例说明什么情况下违反了原则。
参考答案:
- 合适原则:不要追求最牛的架构
- 简单原则:简单 > 复杂
- 演化原则:架构是演化出来的
练习:
- [ ] 分析一个过度设计的案例
- [ ] 分析一个欠设计的案例
- [ ] 举例说明架构是如何演化的
二、高性能练习
3. Reactor模型
问题: 请解释Reactor模型的三种变体,并说明Netty使用哪种模型。
参考答案:
- 单Reactor单线程:简单但会阻塞
- 单Reactor多线程:监听和处理分离
- 主从Reactor:最佳实践,Netty使用
练习:
- [ ] 画出主从Reactor模型图
- [ ] 解释为什么Netty性能好
- [ ] 用Netty实现一个Echo服务器
4. 负载均衡算法
问题: 对比常见负载均衡算法的优缺点和适用场景。
参考答案:
- 随机:简单,分布不均
- 轮询:分布均匀,不考虑性能
- 加权轮询:考虑性能差异
- 最少连接:动态适应
- 一致性哈希:保持会话
练习:
- [ ] 实现加权轮询算法
- [ ] 实现一致性哈希算法
- [ ] 分析不同算法的请求分布
5. 分库分表
问题: 设计一个订单系统的分库分表方案。
参考答案:
分片键:user_id
分片数量:16个库,每个库16个表
路由算法:user_id % 16
为什么选user_id?
-> 大多数查询是按用户查订单
-> 避免跨片查询练习:
- [ ] 设计用户表分片方案
- [ ] 设计订单表分片方案
- [ ] 设计分片后的分页查询方案
6. 缓存架构
问题: 设计一个缓存架构,解决穿透、雪崩、热点问题。
参考答案:
缓存穿透:
-> 布隆过滤器
-> 缓存空值
缓存雪崩:
-> 过期时间加随机值
-> 多级缓存
缓存热点:
-> 互斥锁
-> 永不过期练习:
- [ ] 实现布隆过滤器
- [ ] 实现互斥锁缓存更新
- [ ] 设计多级缓存架构
三、高可用练习
7. CAP定理应用
问题: 分析以下系统应该选CP还是AP,为什么?
- 注册中心
- 配置中心
- 数据库
- 缓存
参考答案:
注册中心:AP(可用性优先)
配置中心:AP(可用性优先)
数据库:CP(一致性优先)
缓存:AP(可用性优先)练习:
- [ ] 分析10个系统的CAP选择
- [ ] 分析为什么注册中心选AP
- [ ] 分析为什么数据库选CP
8. 降级熔断限流
问题: 设计一个电商首页的降级、熔断、限流方案。
参考答案:
限流:全局限流10万QPS
熔断:推荐服务3s超时则熔断
降级:推荐服务挂了返回热门商品练习:
- [ ] 设计秒杀系统的限流方案
- [ ] 设计服务熔断策略
- [ ] 设计降级开关
四、可扩展练习
9. 微服务拆分
问题: 将一个电商单体应用拆分为微服务。
参考答案:
拆分服务:
-> 用户服务
-> 商品服务
-> 订单服务
-> 支付服务
-> 营销服务
每个服务独立数据库
服务间通过RPC或HTTP通信练习:
- [ ] 设计微服务拆分方案
- [ ] 定义服务间接口
- [ ] 设计服务间通信方式
10. 架构演进
问题: 分析一个系统从单体到微服务的演进过程。
参考答案:
阶段1:单体应用
阶段2:垂直拆分(前后端分离)
阶段3:服务化(核心服务独立)
阶段4:微服务(全面拆分)
阶段5:Service Mesh练习:
- [ ] 分析淘宝架构演进
- [ ] 分析Instagram架构演进
- [ ] 设计一个系统的演进路线
五、实战案例练习
11. 秒杀系统设计
问题: 设计一个秒杀系统,支撑100万QPS。
核心复杂度:
1. 高并发:瞬间流量暴增
2. 数据一致性:不能超卖设计方案:
1. 限流:拦截超出容量的请求
2. 缓存:商品信息、库存Redis缓存
3. 异步:下单后异步处理
4. 防超卖:Redis原子扣减
5. 降级:非核心功能降级练习:
- [ ] 画出秒杀系统架构图
- [ ] 设计限流方案
- [ ] 设计防超卖方案
12. Feed流系统设计
问题: 设计一个微博Feed流系统。
核心复杂度:
1. 高并发:大量读写
2. 数据量大:存储压力大
3. 排序:按时间、权重排序设计方案:
1. 写扩散:用户发推时写入粉丝的收件箱
2. 读扩散:用户读取时拉取关注的人的推
3. 混合模式:大V写扩散,普通用户读扩散练习:
- [ ] 设计Feed流存储方案
- [ ] 设计Feed流排序方案
- [ ] 优化大V场景
13. 支付系统设计
问题: 设计一个支付系统。
核心要求:
1. 安全性:资金安全
2. 一致性:账务准确
3. 高可用:7x24稳定设计方案:
1. 幂等性设计
2. 事务一致性(本地消息表)
3. 对账机制
4. 风控系统练习:
- [ ] 设计支付流程
- [ ] 设计幂等性方案
- [ ] 设计对账系统
六、综合练习
14. 架构设计四步法
问题: 用四步法设计一个电商系统。
参考答案:
第一步:识别复杂度
-> 核心复杂度1:高并发
-> 核心复杂度2:数据一致性
第二步:设计备选方案
-> 方案A:单体 + 缓存
-> 方案B:微服务 + MQ
-> 方案C:折中方案
第三步:评估对比
-> 选择方案C
第四步:细化落地
-> 架构图
-> 数据库设计
-> 接口设计练习:
- [ ] 用四步法设计秒杀系统
- [ ] 用四步法设计Feed流系统
- [ ] 用四步法设计支付系统
15. 架构图绘制
练习内容:
- [ ] 画出微服务架构图
- [ ] 画出读写分离架构图
- [ ] 画出分库分表架构图
- [ ] 画出缓存架构图
- [ ] 画出异地多活架构图
七、模拟面试
面试场景1
面试官: "请介绍一下你做过的系统架构"
回答要点:
- 背景:什么系统,解决什么问题
- 架构:技术选型、模块划分
- 挑战:遇到什么问题
- 方案:怎么解决的
- 效果:量化结果
面试场景2
面试官: "为什么选择微服务而不是单体?"
回答要点:
- 团队规模:需要并行开发
- 业务复杂度:单一服务无法应对
- 扩展性:需要独立扩容
- 技术选型:权衡
面试场景3
面试官: "如果让你重新设计,你会怎么改?"
回答要点:
- 回顾原设计的不足
- 提出改进方案
- 说明改进理由
- 体现成长和思考
八、持续学习
推荐资源
书籍:
- 《高性能MySQL》
- 《Designing Data-Intensive Applications》
- 《凤凰架构》
博客:
- 极客时间:从0开始学架构
- 美团技术团队博客
- 阿里云开发者社区
开源项目:
- 分布式事务:Seata
- RPC框架:Dubbo、gRPC
- 服务网格:Istio
实践建议
动手搭建:
- 搭建一个微服务系统
- 搭建一个消息队列
- 搭建一个缓存系统
分析开源:
- 阅读开源项目代码
- 学习架构设计
- 理解技术选型
写技术文章:
- 总结学习心得
- 分享实战经验
- 加深理解
全书总结
架构设计学习路线:
- 基础认知(L1-L2):架构定义、复杂度、三原则、四步法
- 高性能(L3):Reactor、负载均衡、数据库、缓存、MQ
- 高可用(L4):CAP、FMEA、存储高可用、计算高可用、异地多活
- 可扩展(L5):分层、SOA、微服务、微内核
- 架构实战(L6):四步法、案例分析、支付系统
- 面试准备(L7):高频问题、回答技巧
- 练习巩固(L8):题库、模拟面试
核心能力图谱:
- ✅ 架构设计四步法
- ✅ CAP定理理解与应用
- ✅ FMEA分析方法
- ✅ Reactor模型
- ✅ 读写分离与分库分表
- ✅ 缓存架构设计
- ✅ 消息队列设计
- ✅ 负载均衡
- ✅ 限流熔断降级
- ✅ 异地多活
- ✅ 微服务拆分
- ✅ 架构文档写作
继续加油,架构师之路!