在软件工程面试过程中,系统设计轮已成为面试的标准部分。这一轮的主要目的是检查候选人构建复杂和大规模系统的能力。由于缺乏构建大型系统的经验,很多工程师都在这一轮中挣扎。设计问题没有准确标准的答案。对于同一个问题,您可能会与不同的面试官进行不同的对话。由于这一轮的开放性,不仅是初级和中级开发人员,还有经验丰富的开发人员在这一轮中感到不舒服。
这一轮不太关注编码。面试官想知道您如何构建整个系统以及如何将它们粘合在一起。如果您正在为这一轮做准备,那么我们建议您阅读博客如何在面试中破解系统设计回合?。在开始为某些特定问题做准备之前,您应该了解系统设计的一些重要概念。我们将介绍一些系统设计的基本概念,为这一轮的问题打下坚实的基础。
1. 负载均衡
在系统中,服务器具有一定的容量来处理来自用户的负载或请求。如果服务器同时接收的大量请求超过其容量,则服务器的吞吐量会降低,并且可能会变慢。此外,如果它持续更长的时间,它可能会失败(不可用)。您可以添加更多服务器(横向扩展)并通过在这些服务器之间分配请求数量来解决此问题。现在的问题是谁将负责分配请求和平衡负载。谁来决定应该将哪个请求分配给哪个服务器以减轻单个服务器的负担?这就是负载均衡器的作用。
负载平衡器的工作是将流量分配到许多不同的服务器,以帮助提高吞吐量、性能、延迟和可扩展性。您可以将负载均衡器放在客户端的前面(也可以插入到其他地方),然后负载均衡器会将传入的请求路由到多个 Web 服务器。简而言之,负载均衡器是流量管理器,它们负责系统的可用性和吞吐量。 Nginx、Cisco、TP-Link、Barracuda、Citrix、来自 AWS 的 Elastic Load Balancing……这些是市场上一些流行的负载均衡器。
2.缓存
我们在负载平衡部分讨论了服务器上的负载,但您需要知道的一件事是,您的 Web 服务器通常不是第一个宕机的服务器,实际上,通常是您的数据库服务器可能在很多情况下都处于高负载状态写或读操作。我们经常访问数据库进行各种查询和连接,这会降低系统的性能。处理这些查询和大量读写缓存是最好的技术。
每次您的厨房需要一些东西时,您会去最近的商店购买一些必需品吗?绝对没有。每次我们想购买一些基本的东西并将其存放在我们的冰箱和食品柜中时,而不是去最近的商店。这就是缓存。如果冰箱中已有食物,则烹饪时间会缩短。这样可以节省很多时间。同样的事情发生在系统中。从主内存 (RAM) 访问数据比从辅助内存(磁盘)访问数据更快。通过使用缓存技术,您可以加快系统的性能。
如果您需要经常依赖某个数据,那么缓存数据并从内存而不是磁盘中更快地检索它。此过程减少了后端服务器上的工作量。缓存有助于减少对数据库的网络调用。一些流行的缓存服务是 Memcache、Redis 和 Cassandra。许多网站使用 CDN(内容交付网络),这是一个全球服务器网络。 CDN 缓存静态资产文件,如图像、javascript、HTML 或 CSS,它使用户的访问速度非常快。您可以在客户端(例如浏览器存储)、客户端和服务器之间(例如 CDN)或服务器本身插入缓存。
3. 代理
您可能经常在 PC 中看到一些添加和配置代理服务器的通知,但代理服务器究竟是什么以及它是如何工作的?通常,代理服务器是位于客户端和另一台服务器之间的一些代码或中间硬件/软件。它可能驻留在用户的本地计算机上或客户端和目标服务器之间的任何位置。代理服务器接收来自客户端的请求并将其传输到源服务器,然后将接收到的响应从服务器转发到发起者客户端。在某些情况下,当服务器收到请求时,IP 地址并不与客户端相关联,而是属于代理服务器。当代理服务器隐藏客户端的身份时会发生这种情况。
一般来说,当人们使用术语代理时,他们指的是“转发代理”。 “转发代理”旨在帮助用户,它在客户端和服务器之间的交互中代表(替代)客户端。它转发用户的请求并充当用户的个人代表。在系统中,尤其是在复杂系统中的设计中,代理非常有用,尤其是“反向代理”非常有用。 “反向代理”与“正向代理”相反。反向代理代表服务器运行,旨在帮助服务器。
在“正向代理”中,服务器不会知道请求和响应是通过代理路由的,而在反向代理中,客户端不会知道请求和响应是通过代理传输的。 “反向代理”可以分配很多任务来帮助主服务器,它可以充当看门人、筛选器、负载平衡器和全能助手。
代理通常用于处理请求、过滤请求或记录请求,或者有时会转换请求(通过添加/删除标头、加密/解密或压缩)。它有助于协调来自多个服务器的请求,并可用于从系统范围的角度优化请求流量。
转发代理:
反向代理:
4. CAP 定理
CAP 代表Consistency, Availability, and Partition tolerance 。该定理指出,您无法在单个数据库中获得最佳级别的所有属性,因为项目之间存在自然的权衡。您一次只能从三个中选择两个,这完全取决于您根据需求确定的优先级。例如,如果您的系统需要可用和分区容忍,那么您必须愿意接受一致性要求中的一些延迟。传统关系型数据库自然适合CA端,而非关系型数据库引擎主要满足AP 和 CP要求。
- 一致性意味着任何读取请求都将返回最近的写入。 SQL 数据库的数据一致性通常是“强”的,而 NoSQL 数据库的一致性可能是从“最终”到“强”的任何内容。
- 可用性意味着非响应节点必须在合理的时间内响应。并非每个应用程序都需要以 99.999% 的可用性运行 24/7,但很可能您会更喜欢具有更高可用性的数据库。
- 分区容错意味着尽管网络或节点出现故障,系统仍将继续运行。
在你的系统设计面试中记住这个 CAP 定理。根据申请类型和您的优先事项做出决定。如果您的系统停机几秒钟或几分钟,实际上是否可以,如果没有,那么可用性应该是您的首要关注点?如果您正在处理具有真实交易信息的事物,例如股票交易或金融交易,您可能首先重视一致性。尝试选择最适合您要进行权衡的技术。
注意: CA 系统不是为分布式系统定义的。但是,在单节点设置的情况下,您可以获得 CA 功能。此外,由于网络故障,分布式系统必须支持分区容错。因此,您可以选择一致性或可用性,即构建 CP 或 AP 系统。
5. 数据库
在系统设计面试中,经常会被要求设计关于您可能使用哪些表的数据库模式?什么是主键看起来像什么,你的索引是什么。您还需要选择为不同用例设计的不同类型的存储解决方案(关系型或非关系型)。我们将讨论一些在系统设计中经常使用的数据库的重要概念。
- 数据库索引:数据库索引通常是一种有助于快速搜索数据库的数据结构……但是如何呢?让我们通过一个例子来理解。假设您有一个包含 2 亿行的数据库表,该表用于在每条记录中查找一两个值。现在,如果您需要从特定行检索值,那么您需要遍历表,这可能是一个耗时的过程,尤其是如果它是表中的最后一条记录。我们可以对这类问题使用索引。
基本上,索引是对多个字段上的多个记录进行排序的方式。当您在表中的某个字段上添加索引时,它会创建另一个数据结构来保存该字段值,以及一个指向它相关记录的指针。然后对该索引结构进行排序,允许对其执行二进制搜索。如果您在一个包含姓名和年龄的表中有 2 亿条记录,并且您想要检索属于某个年龄组的人员列表,那么您需要将年龄属性的索引添加到数据库中。从数据库中的索引链接中阅读有关此主题的更多信息。 - 复制:如果您的数据库处理如此多的负载会发生什么?它会在某个时刻崩溃,您的整个系统将停止工作,因为所有请求都依赖于服务器中的数据。为了避免这种失败,我们使用复制,这只是意味着复制您的数据库(主)并只允许对数据库的这些副本(从)进行读取操作。复制解决了系统中的可用性问题,并确保数据库出现故障时的冗余。您创建了数据库的副本(从),但是如何从原始(主)数据库中提取数据?您将如何跨副本同步数据,因为它们意味着具有相同的数据?
您可以根据需要选择同步(与主数据库更改同时)或异步方法。如果它是异步的,那么您可能不得不接受一些不一致的数据,因为主数据库中的更改在崩溃之前可能不会反映在从数据库中。如果您需要两个数据库之间的状态保持一致,那么复制需要快速并且您可以采用同步方法。您还需要确保如果对副本的写操作失败,则对主数据库的写操作也会失败(原子性)。
- 分片或数据分区:数据复制解决了可用性问题,但没有解决吞吐量和延迟问题(速度)。在这些情况下,您需要对数据库进行分片,这仅意味着“分块”或对数据记录进行分区并将这些记录存储在多台机器上。因此,分片数据会将庞大的数据库分解为较小的数据库。以执行大量写入的 Twitter 为例。要处理这种情况,您可以使用数据库分片,将数据库拆分为多个主数据库。
数据库分片主要有两种方式——水平分片和垂直分片。在垂直分片中,您将每张桌子放入一台新机器中。因此,如果您有一个用户表、一个推文表、一个评论表、一个用户支持表,那么这些表中的每一个都将在不同的机器上。现在,如果您有一个推文表并且它非常大怎么办?在这种情况下,您可以使用水平分片,将单个表拆分到多台机器上。您可以使用诸如用户 ID 之类的某种键,您可以将数据分成几部分,然后您可以将数据分配到不同的机器。因此,水平分区取决于一个键,它是您存储的用于分区数据的数据的属性。
GeeksforGeeks 系统设计课程
想在领先的科技公司获得软件开发人员/工程师的工作吗?或 想要从 SDE I 平稳过渡到 SDE II 或高级开发人员配置文件?如果是,那么您需要深入了解系统设计世界!对系统设计概念的正确掌握非常重要,尤其是对于工作专业人士而言,要在技术面试中获得比其他人急需的优势。
这就是为什么 GeeksforGeeks 为您提供以深度面试为中心的System Design – Live Course ,它将帮助您准备与 Google、Amazon、Adobe、Uber 和其他基于产品的公司的 System Designs 相关的问题。