System Design
学习连接 github
怎么回答系统设计的面试题
第一步:描述使用场景,约束和假设
把所有需要的东西聚集在一起,审视问题。不停的提问,以至于我们可以明确使用场景和约束。讨论假设。
- 谁会使用它?
- 他们会怎样使用它?
- 有多少用户?
- 系统的作用是什么?
- 系统的输入输出分别是什么?
- 我们希望处理多少数据?
- 我们希望每秒钟处理多少请求?
- 我们希望的读写比率?
第二步:创造一个高层级的设计
使用所有重要的组件来描绘出一个高层级的设计。
- 画出主要的组件和连接
- 证明你的想法
第三步:设计核心组件
对每一个核心组件进行详细深入的分析。举例来说,如果你被问到设计一个 url 缩写服务,开始讨论:
- 生成并储存一个完整 url 的 hash
- MD5 和 Base62
- Hash 碰撞
- SQL 还是 NoSQL
- 数据库模型
- 将一个 hashed url 翻译成完整的 url
- 数据库查找
- API 和面向对象设计
第四步:扩展设计
确认和处理瓶颈以及一些限制。举例来说就是你需要下面的这些来完成扩展性的议题吗?
- 负载均衡
- 水平扩展
- 缓存
- 数据库分片
论述可能的解决办法和代价。每件事情需要取舍。可以使用可扩展系统的设计原则来处理瓶颈。
预估计算量
你或许会被要求通过手算进行一些估算。附录涉及到的是下面的这些资源:
相关资源和延伸阅读
查看下面的链接以获得我们期望的更好的想法:
第 1 层:通用 System Design 基础(和互联网共通)
先保证你能搞定这些“标准菜”:
- 基本组件:
- Load balancer、API gateway、cache、message queue、数据库、对象存储
- 基础概念:
- 水平 vs 垂直扩展、sharding、replication、CAP、大致知道
- 常见设计套路:
- 读多写少用 cache、写多用 log + 异步消费、冷热分层、幂等、重试等
练习建议:
- 设计:URL 短链、Feed 流、通知系统、统计系统
- 每次都要能说清楚:
- QPS / TPS 估算
- 存储容量估算
- 高可用方案(多副本、跨机房)
这一层不懂,量化那边的东西也很难讲清楚。
第 2 层:量化/交易场景专门强化
这里给你几个“必练题”,你可以一题一题画架构、说 trade-off:
题 1:设计一个 Market Data Ingestion & Distribution 系统
需求点你要主动问 + 自己补充:
- Sources:多家交易所 / 数据源,UDP 多播 / TCP
- 目标:
- 为策略引擎提供本地共享内存 / 内存队列的行情
- 为回测系统落盘(原始 tick 或聚合 bar)
- 重点考点:
- 如何保证低延迟:
- 尽量少拷贝、Zero-copy、内存池、批量处理
- 如何处理乱序 / 丢包 / 重传:
- 序列号、心跳、gap 请求
- 如何做多级 cache:
- 最近 N 档 order book 在内存,历史 tick 在本地磁盘或集中存储
- 故障场景:
- 行情接收进程挂了、网络抖动、单一交易所 data center 宕机
题 2:设计一个订单通道 + 实时风控
- 典型路径:
Strategy → Order Gateway → Risk Engine → Exchange - 问题你要能回答:
- 风控是在 本地 还是 集中 做?为什么?
- 风控规则如何配置 & 热更新?重启吗?
- 如何保证“风控不过的订单 100% 不会出去”?
- 如何做到“风控不成为延迟瓶颈”?(预加载、预计算、用 bitset/bitmap 做规则)
- Failover:一个 order gateway 挂了怎么办?重连 / 重发 / 序号管理?
题 3:设计一个回测 / 研究平台
- 能说清楚:
- 历史数据存在哪里(对象存储/分布式 FS/列存)?
- 回放方式:按时间线回放 tick,策略按统一接口消费
- 如何支持多策略并行回测?
- 如何保证“回测结果可复现”:
- 版本化:数据版本、代码版本、配置版本
- 输出报告 / 日志
第 3 层:面试看重的“表达套路”
不只是你懂不懂,还看你怎么讲。 你可以固定一个“答题模板”:
- 先确认目标 & 约束
- Latency 要求?吞吐?可用性?
- 交易市场数量?产品数量?数据量大致量级?
- 画一个高层架构
- 若是交易系统:
- Strategy Cluster、Order Gateway、Risk、MD Handler、Exchange Adapter
- 若是数据系统:
- Ingestion → Normalize → Storage → Query/Compute
- 选一两个关键点深挖
- 对量化来说,优先深挖:
- 延迟关键路径(比如从下单到回报)
- 风险控制 & 容错场景(比如数据错了、流程挂了怎么办)
- 考虑故障与监控
- 健康检查、心跳
- Metrics(延迟、丢包率、订单拒绝率)
- 日志与回放(出了问题能复盘)
- 总结 trade-off
- 延迟 vs 可用性
- 精度 vs 性能
- 开发复杂度 vs 系统灵活性
你可以自己练: 找一个问题,比如“设计订单路由系统”,按上面这 5 步写一遍,然后看哪里讲不清楚。
步骤
澄清需求
- 做什么
- 功能需求
- 做多大
- QPS预期多少