开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情
写在前面
系统设计文章系列是对《System Design Interviews:A step by step guide》的理解和总结,其中会涉及大量的系统设计案例以及系统设计原则记录笔记形成文章,在知识输入的同时对其总结消化并进行文章输出。
系统设计遵循的步骤
Step 1: Requirements clarifications 需求说明
系统设计在大多数情况下是开放的,没有标准答案,所以明确我们要解决问题的确切范围、目标对系统设计来说是很有必要的,这也可以有效的防止系统过度设计导致资源的浪费,尤其在项目的初期,需求不确定性很大,对系统的过度设计在项目随时间进行中会让人变得沮丧。
Step 2: System interface definition 定义系统接口
定义系统需要哪些 API, 明确系统的输入和输出确保我们是否没有错误地提出任何要求。
Step 3: Back-of-the-envelope estimation 粗略的估计
对系统规模进行粗略的估计,系统需要多少存储资源、需要多少网络带宽、多少访问流量、多少计算资源。
Step 4: Defining data model 定义数据模型
定义数据模型所属系统,定义他们之间的交互关系以及如何管理这些数据,如数据如何存储、如何传输是否需要加密等。
Step 5: High-level design 架构设计或概要设计
进行概要设计:确定系统从端到端解决实际问题所需的足够组件。
Step 6: Detailed design 详细设计
系统详细设计则是对概要设计设计的组件的深挖:组件有哪些不同的实现方式,他们的优点和缺点是什么,为什么选择这种方式而不是另一种。请记住,没有单一的答案,唯一重要的是考虑不同选项之间的权衡同时牢记系统约束。
- 我们要存储大量数据,数据如何分区以分发到多个数据库?我们应该尝试将用户的所有数据存储在同一数据库中吗?它会导致什么问题?
- 我们应该在多大程度上以及在哪一层引入缓存来加快速度?
- 哪些组件需要更好的负载平衡?
Step 7: Identifying and resolving bottlenecks 识别和解决瓶颈
尝试讨论尽可能多的瓶颈以及缓解瓶颈的不同方法。
- 我们的系统中是否存在任何单点故障?我们正在做些什么来缓解它?
- 我们是否有足够的数据副本,以便如果我们丢失了一些服务器,我们仍然可以为用户提供服务?
- 我们是否有足够的不同服务的副本正在运行,以便一些故障不会导致系统完全关闭?
- 我们如何监控服务的性能?每当关键组件发生故障或其性能下降时,我们是否会收到警报?