系统设计是定义组件及其集成、API 和数据模型以构建满足一组指定功能和非功能需求的大型系统的过程。
系统设计使用计算机网络、并行计算和分布式系统的概念来设计可扩展且高性能的系统。分布式系统本质上具有良好的可扩展性。然而,分布式系统本质上是复杂的。系统设计的纪律可以帮助我们克服这种复杂性并完成工作。

系统设计的目的是构建可靠、有效、可维护等特征的系统。
我们分离出常用的设计元素,例如负载均衡器,作为高级系统设计的基本构建块。这有两个目的。首先,它使我们能够详细讨论所有构建块并讨论它们有趣的迷你设计问题。其次,当我们解决设计问题时,我们可以专注于特定问题的方面,提及我们将使用的构建块以及我们将如何使用它。这有助于我们消除对常见设计元素的重复讨论。
我们已经确定了对于设计现代系统至关重要的十六个构建模块。


了解系统设计访谈 (SDI) 以及如何战略性地进行这些访谈。

SDI 发生在更高的抽象级别。我们找出需求并将其映射到计算组件和连接这些子系统的高级通信协议。
最终答案并不重要。重要的是优秀的申请人带领面试官经历的过程和旅程。
注意:与面试中的编码问题相比,系统设计更符合我们将在工作中完成的任务。
设计问题是开放式的,并且一开始就故意含糊其辞。这种模糊性模仿了现代商业的现实。
面试官经常询问一个众所周知的问题,例如设计 WhatsApp。现在,真正的 WhatsApp 应用程序具有众多功能,将所有这些功能作为我们的 WhatApp 克隆的要求可能不是一个明智的主意,原因如下:
我们可以告诉面试官,真正的 WhatsApp 所做的许多其他事情我们不打算包含在我们的设计中。如果面试官有任何异议,我们可以相应地改变我们的行动计划。
以下是我们在系统设计面试期间应遵循的一些最佳实践:

申请人应该提出正确的问题来巩固要求。
申请人还需要确定问题的范围,以便他们能够在面试的有限时间内尽力解决问题。SDI 的长度通常约为 35 至 40 分钟。
与面试官的沟通至关重要。默默地做设计并不是一个好主意。相反,我们应该与面试官接触,以确保他们理解我们的思维过程。
在较高层次上,组件可以是前端、负载均衡器、缓存、数据处理等。系统设计告诉我们这些组件如何组合在一起。
架构设计通常将组件表示为盒子。这些方框之间的箭头代表谁与谁交谈以及这些方框或组件如何组合在一起。

我们可以针对给定的问题画一张如上所示的图表并将其呈现给面试官。
SDI 通常包括与设计如何随着时间的推移而演变相关的问题,因为系统的某些方面增加了某个数量级,例如用户数量、每秒查询数量等。系统社区普遍认为,当系统的某些方面增加十倍或更多时,相同的设计可能不再适用,可能需要更改。
设计和操作更大的系统需要仔细思考,因为设计通常不会随着系统需求的增加而线性扩展。
SDI 中的另一个问题可能与我们为什么不设计一个已经能够处理比必要或预测更多的工作的系统有关。
与复杂项目相关的美元成本是我们不这样做的主要原因。
谷歌搜索早期版本的设计在今天看来可能很简单,但在当时却相当复杂。它还降低了成本,这对于像谷歌这样的初创公司维持生存是必要的。结果是,作为设计师,我们所做的一切都会对企业及其客户产生影响。我们需要通过有效利用资源来满足或超越客户的需求。
随着时间的推移,事情会发生变化,并且会因为以下原因而崩溃:
作为设计师,我们需要在设计层面提供容错能力,因为几乎所有现代系统都使用现成的组件,而且这样的组件有数百万个。因此,总会有一些东西发生故障,我们需要向客户隐瞒这种不良的现实。
大多数系统设计理论都来自分布式系统领域。分布式系统为我们提供了成熟软件原理的指南。其中包括以下内容:
举个例子,我们可能会说,当网络组件发生故障时,我们需要在可用性和一致性之间进行权衡,因为 CAP 定理表明,在网络分区下我们不能同时拥有这两者。这种共同语言有助于沟通,并表明我们精通理论和实践。
https://www.educative.io/courses/grokking-modern-system-design-interview-for-engineers-managers/introduction-to-modern-system-design