
什么是系统设计训练器?
系统设计训练器是一个用于练习系统设计面试的交互式白板。你可以选择一个场景,将 AWS 或 Azure 组件拖到画布上,把它们连接成一个架构,并运行确定性的容量模拟。
模拟器会估算每个组件能够支持的流量,识别系统瓶颈,并突出显示架构风险。设计完成后,Jev 可以评估无法仅通过容量计算判断的因素,包括可扩展性、可靠性、数据设计以及你的书面说明。
主要功能
- 交互式架构画布:白板通过 React Flow 和
@xyflow/react构建。 - 结构化练习:项目包含四个章节共 15 个关卡。
- 实时容量建模:每个节点都会显示利用率及其可支持用户数的估算值。
- 架构诊断:模拟器会标记单点故障、缺少负载均衡器以及客户端直接连接数据库等问题。
- 成本和可用性估算:系统会在吞吐量计算之外提供其他指标。
- 面试官式评估:Jev 会对可扩展性、可靠性、数据设计和书面说明进行评分,然后建议下一步需要改进的内容。
- 自定义技术:你可以输入 Kafka、MongoDB 或 NGINX 等技术。Jev 会识别它们在架构中的作用,以便应用分配容量配置。
- 本地进度:设计和场景进度会存储在浏览器中。
- 自由练习:在结构化关卡之外,还提供一个开放式白板。
安装并运行项目
1. 安装依赖
克隆或下载仓库,在终端中打开其目录,然后安装 npm 依赖:
npm install
2. 创建本地环境文件
将随附的环境模板复制为 .env.local:
cp .env.example .env.local
3. 配置 Jev
如需接收真实的 Jev 回答,请将 TYPESAFE_API_KEY 值添加到 .env.local。Jev 在 lib/server/jev.ts 中通过 @typesafe-ai/sdk 实现。
没有 API 密钥时,应用仍然可以运行。在这种情况下,Jev 的回答会回退为明确标注的模拟结果,让你无需外部评估也能体验其余工作流程。
4. 启动开发服务器
npm run dev
打开开发服务器报告的本地地址,即可开始使用训练器。
完成你的第一个系统设计练习
- 选择提示。选择一个场景,例如为一百万用户设计基础设施。每个场景都会提供固定的用户数和要求。
- 阅读目标。关卡包含必需目标和可选加分目标,这些目标会在运行设计时进行检查。
- 添加云组件。将合适的 AWS 或 Azure 组件拖到白板上。
- 连接架构。根据场景需要,在客户端、网络组件、应用服务、缓存、队列和数据库之间创建请求路径和数据路径。
- 运行设计。查看利用率、支持用户数估算、可用性、成本和架构警告。
- 解决瓶颈。根据过载组件或结构性警告更新设计,然后再次运行。
- 请求 Jev 反馈。准备好后,提交设计和书面说明进行评估。
关卡评分方式
完成所有必需目标可获得一颗星。每个加分目标可额外获得一颗星。星星会提供 XP 并计入你的等级,进度则会保留在浏览器中。
第 4 章要求你根据 Azure Architecture Center 重建参考架构。完成其中一个关卡后,训练器会链接到原始架构。
了解容量模型
容量引擎位于 lib/simulate.ts 中。它具有确定性,不使用 AI。峰值负载根据场景通过以下关系计算:
DAU × 每日请求数 ÷ 86,400 × 峰值系数
模型会将该负载分为读取和写入,然后从 Users 节点开始沿连接的图传播。
常见组件如何影响流量
- CDN:吸收场景标记为可在边缘缓存的那部分流量。
- 缓存:根据命中率吸收读取请求。模型支持旁路缓存的同级放置和内联放置。
- 队列:将写入请求从同步路径中移除,并使其平滑地趋近平均请求速率。
- 同级组件:同类组件会平均分配负载。例如,连接到两个应用组的负载均衡器会在它们之间分配流量。
- SQL 数据库:写入容量受单个主节点限制。
- NoSQL 数据库:写入容量会随分区数量扩展。
每个节点都会报告利用率以及一个 supports ~N users 估算值,该估算值根据场景用户数除以利用率计算得出。整个系统的容量由支持用户数估算值最低的瓶颈决定。
设计迭代示例
假设某个设计将所有客户端流量直接发送到一个应用组件,然后再发送到数据库。运行模拟可能会发现应用或数据库是瓶颈,同时还会出现可靠性警告。
随后,你可以通过添加合适的流量分配、缓存、异步处理或数据组件来修改架构。例如,置于负载均衡器后的同级应用组可以分担应用流量;缓存可以根据命中率减少数据库读取;队列则可以将写入操作移出同步路径。每次修改后都重新运行模型,查看瓶颈是否转移到了其他位置。
更高的容量估算值并不会自动让设计变得正确。使用 Jev 评估可靠性、数据设计、可扩展性方面的权衡,以及你做出这些选择背后的依据。
有效使用 Jev
确定性模拟器会将计算出的数值作为事实提供给 Jev。Jev 随后负责处理无法简化为吞吐量公式的判断。
- 评估分数:评审可扩展性、可靠性、数据设计以及书面说明。
- 改进选择:选择下一步应改进的内容。
- 检查清单判断:针对场景检查清单中的每一项生成一个 Noul。
- 自定义组件分类:为你输入的技术分配架构角色,使训练器能够应用相应的容量配置。
要获得更有价值的反馈,请让书面说明足够明确。描述流量流向、扩展假设、故障处理、读写模式,以及每个主要组件存在的原因。
高级技巧
优化瓶颈,而不是每个组件
系统最多只能支持其限制性组件所能支持的用户数。先从显示最低支持用户数估算值的节点入手。修改设计后再次运行模拟,因为缓解一个瓶颈可能会暴露出另一个瓶颈。
比较同步与异步路径
队列会将写入操作移出同步请求路径,并使其平滑地接近平均负载。当场景允许异步处理时,使用模型比较直接写入路径与队列架构。
测试缓存位置
模拟器能够识别缓存旁路模式中作为同级组件使用的缓存,以及以内联方式放置的缓存。观察缓存位置和命中率如何影响下游读取流量。
留意结构性警告
不要只关注利用率。检查单点故障、缺少负载均衡器以及客户端直接连接数据库等问题。即使原始容量足够,这些警告也可能揭示可靠性或安全性方面的设计缺陷。
检查目录数值背后的来源
容量、可用性和成本数据定义在 lib/catalog.ts 中。每个数值的来源都会显示在组件属性卡片中。这些数值分为官方限制、官方 SLA、供应商基准、假设值,或没有公开限制的服务。
- 官方限制:已发布的 AWS 或 Azure 配额,例如账户级请求限流。
- 官方 SLA:供应商承诺的月度正常运行时间。
- 供应商基准:已发布但不提供保证的性能数据。
- 假设值:在没有供应商数据可用时采用的建模值。项目也将所有成本视为假设值。
- 没有公开限制:按可独立扩展建模的服务,因此不会成为瓶颈。
README 说明这些来源最后于 2026 年 9 月核查。云配额会发生变化,而且其中许多配额可以申请提高,因此模拟结果应被视为估算值,而非保证。
探索或扩展场景
场景定义存储在 lib/scenarios.ts 中,15 个结构化关卡定义在 lib/levels.ts 中。扩展可用练习提示时,请在 lib/scenarios.ts 中添加场景。
了解浏览器持久化
画布设计会按场景保存到 localStorage 中,进度也会保存在浏览器中。请记住,浏览器存储仅适用于当前浏览器配置文件和环境。
结论
系统设计训练器结合了交互式云架构画布、确定性容量建模、结构化目标以及基于 Jev 的设计评审。使用模拟器测试可衡量的行为,利用警告发现结构性问题,并使用 Jev 改进系统设计面试中所要求的推理和权衡分析。
