要在关于系统设计的面试中脱颖而出,最关键的方面之一是深入理解基本的系统设计概念,例如,负载平衡、缓存、分区、复制、数据库和代理。
根据我自己的经验,我确定了 16 个关键概念,它们可以帮助你提高解决系统设计问题的能力。
这些概念的范围从理解 API 网关的复杂性和掌握负载平衡技术到掌握 CDN 的重要性和理解缓存在现代分布式系统中的作用。阅读完本文时,你将全面了解这些基本思想,并有信心在下一次面试中应用它们。
系统设计面试本质上是非结构化的。在面试过程中,很难跟踪事情并确保你已经触及设计的所有基本方面。
为了简化这个过程,我开发了一个系统设计主模板,可以帮助你回答任何系统设计面试问题,深入了解任何系统设计中可能涉及的关键组件。
请牢记这个主模板,我们将讨论 16 个基本系统设计概念。
现在我们开始吧。
1.域名系统(DNS)
域名系统 (DNS) 是互联网基础设施的基本组成部分,可将人类友好的域名转换为相应的 IP 地址。
它的功能类似于 Internet 电话簿,允许用户通过键入易于记忆的域名(例如 www.google.com)而不是计算机用来相互识别的数字 IP 地址(例如“192.168.2.1”)来访问网站和服务。
当你在 Web 浏览器中输入域名时,DNS 负责查找关联的 IP 地址并将你的请求定向到正确的服务器。
该过程从你的计算机向递归解析器发送查询开始,然后搜索一系列 DNS 服务器,从根服务器开始,然后是顶级域 (TLD) 服务器,最后是权威名称服务器。
找到 IP 地址后,递归解析器会将其返回到你的计算机,让你的浏览器与目标服务器建立连接并访问所需的内容。
2.负载均衡器
负载均衡器是一种网络设备或软件,可在多个服务器之间分配传入的网络流量,以确保最佳的资源利用率、减少延迟并保持高可用性。
它在扩展应用程序和有效管理服务器工作负载方面起着至关重要的作用,尤其是在流量突然激增或服务器之间请求分布不均的情况下。
负载均衡器使用不同的算法来确定如何分配传入流量。
常见的算法包括:
- 循环:请求以循环方式按顺序均匀分布在所有可用服务器上。
- 最少连接:负载均衡器将请求分配给活动连接最少的服务器,优先处理不太繁忙的服务器。
- IP 哈希:对客户端的 IP 地址进行哈希处理,结果值用于确定应将请求定向到哪个服务器。此方法可确保特定客户端的请求始终路由到同一服务器,从而有助于保持会话持久性。
3.API网关
API 网关是一种服务器或服务,充当外部客户端与应用程序的内部微服务或基于 API 的后端服务之间的中介。它是现代架构中的一个重要组件,尤其是在基于微服务的系统中,它简化了通信过程并为客户端提供了访问各种服务的单一入口点。
API网关的主要功能包括:
- 请求路由:它根据预定义的规则和配置,将来自客户端的传入 API 请求定向到适当的后端服务或微服务。
- 身份验证和授权:API网关可以处理用户身份验证和授权,确保只有授权的客户端才能访问服务。它可以在将请求路由到后端服务之前验证 API 密钥、令牌或其他凭据。
- 速率限制和节流:为了保护后端服务免受过度负载或滥用,API 网关可以根据预定义的策略强制执行速率限制或节流来自客户端的请求。
- 缓存:为了减少延迟和后端负载,API 网关可以缓存常用的响应,直接将它们提供给客户端,而无需查询后端服务。
- 请求和响应转换:API 网关可以修改请求和响应,例如转换数据格式、添加或删除标头或修改查询参数,以确保客户端和服务之间的兼容性。
4.CDN
内容分发网络 (CDN) 是一种分布式服务器网络,用于存储图像、视频、样式表和脚本等内容并将其分发给地理位置较近的用户。CDN 旨在提高向最终用户交付内容的性能、速度和可靠性,无论他们相对于原始服务器的位置如何。
CDN 的工作原理如下:
- 当用户从网站或应用程序请求内容时,请求会被定向到最近的 CDN 服务器,也称为边缘服务器。
- 如果边缘服务器缓存了请求的内容,它会直接将内容提供给用户。这减少了延迟并改善了用户体验,因为内容传输的距离更短。
- 如果内容未缓存在边缘服务器上,则 CDN 从源服务器或附近的另一个 CDN 服务器检索它。获取内容后,会将其缓存在边缘服务器上并提供给用户。
- 为确保内容保持最新,CDN 会定期检查源服务器的更改并相应地更新其缓存。
5. 正向代理与反向代理
转发代理,也称为“代理服务器”或简称为“代理”,是位于一台或多台客户端计算机前面并充当客户端和 Internet 之间的中介的服务器。
当客户端机器向 Internet 上的资源发出请求时,该请求首先被发送到转发代理。然后,转发代理代表客户端将请求转发到 Internet,并将响应返回给客户端。
反向代理是位于一个或多个 Web 服务器之前的服务器,充当 Web 服务器和 Internet 之间的中介。
当客户端向 Internet 上的资源发出请求时,该请求首先被发送到反向代理。
然后反向代理将请求转发到其中一个 Web 服务器,该服务器将响应返回给反向代理。然后反向代理将响应返回给客户端。
6.缓存
缓存是位于应用程序和原始数据源(例如数据库、文件系统或远程 Web 服务)之间的高速存储层。
当应用程序请求数据时,首先在缓存中检查数据。如果在缓存中找到数据,则将其返回给应用程序。
如果在缓存中找不到数据,则从其原始来源检索数据,将其存储在缓存中以备将来使用,然后返回给应用程序。
在分布式系统中,缓存可以在多个地方完成,例如,客户端、DNS、CDN、负载均衡器、API 网关、服务器、数据库等。
7.数据分区
在数据库中,水平分区(也称为分片)涉及将表的行划分为更小的表并将它们存储在不同的服务器或数据库实例上。这样做是为了在多个服务器之间分配数据库的负载并提高性能。
另一方面,垂直分区涉及将表的列划分为单独的表。这样做是为了减少表中的列数并提高仅访问少量列的查询的性能。
8. 数据库复制
数据库复制是一种用于跨不同服务器或位置维护同一数据库的多个副本的技术。
数据库复制的主要目的是提高数据可用性、冗余性和容错性,确保系统即使在硬件故障或其他问题的情况下也能继续运行。
在复制数据库设置中,一台服务器充当主(或主)数据库,而其他服务器充当副本(或从属)。该过程涉及在主数据库和副本之间同步数据,因此它们都具有相同的最新信息。
数据库复制有几个好处,包括:
- 改进的性能:通过在多个副本之间分配读取查询,可以减少主数据库的负载并缩短查询响应时间。
- 高可用性:如果主数据库发生故障或停机,副本可以继续提供数据,确保对应用程序的访问不间断。
- 增强的数据保护:在不同位置拥有多个数据库副本有助于防止由于硬件故障或其他灾难导致的数据丢失。
- 负载平衡:副本可以处理读取查询,这样可以更好地分配负载并减少主数据库的整体压力。
9.分布式消息系统
分布式消息传递系统支持以可靠、可扩展和容错的方式在多个可能在地理上分散的应用程序、服务或组件之间交换消息。
它们通过解耦发送方和接收方组件来促进通信,使它们能够独立发展和运行。分布式消息系统在大规模或复杂系统中特别有用,例如微服务架构或分布式计算环境中的系统。此类系统的示例有 Apache Kafka 和 RabbitMQ。
10.微服务
微服务是一种架构风格,其中应用程序被构造为小型、松散耦合且可独立部署的服务的集合。
每个微服务负责应用程序中的特定功能或域,并通过定义明确的 API 与其他微服务进行通信。
这种方法与传统的单体架构不同,在传统单体架构中,应用程序被构建为一个紧密耦合的单元。
微服务的主要特点是:
- 单一职责:每个微服务都专注于特定的功能或领域,遵循单一职责原则。这使服务更易于理解、开发和维护。
- 独立性:微服务可以相互独立地开发、部署和扩展。这可以提高开发过程的灵活性和敏捷性,因为团队可以同时处理不同的服务,而不会影响整个系统。
- 去中心化:微服务通常是去中心化的,每个服务都拥有自己的数据和业务逻辑。这鼓励关注点分离,并使团队能够做出决策并选择最适合其特定需求的技术。
- 通信:微服务使用轻量级协议(例如 HTTP/REST、gRPC 或消息队列)相互通信。这促进了互操作性,并使集成新服务或替换现有服务变得更加容易。
- 容错性:由于微服务是独立的,一个服务出现故障并不一定会导致整个系统出现故障。这有助于提高应用程序的整体弹性。
11. NoSQL 数据库
NoSQL 数据库或“Not Only SQL”数据库是非关系数据库,旨在存储、管理和检索非结构化或半结构化数据。
它们为依赖结构化数据和预定义模式的传统关系数据库提供了替代方案。NoSQL 数据库因其灵活性、可扩展性和处理大量数据的能力而变得流行,使它们非常适合现代应用程序、大数据处理和实时分析。
NoSQL 数据库可以分为四种主要类型:
- 基于文档:这些数据库将数据存储在类似文档的结构中,例如 JSON 或 BSON。每个文档都是独立的,可以有自己独特的结构,使它们适合处理异构数据。基于文档的 NoSQL 数据库的示例包括 MongoDB 和 Couchbase。
- 键值对:这些数据库将数据存储为键值对,其中键充当唯一标识符,值保存关联数据。键值数据库对于简单的读写操作非常高效,并且可以轻松地进行分区和水平扩展。键值 NoSQL 数据库的示例包括 Redis 和 Amazon DynamoDB。
- 列族:这些数据库将数据存储在列族中,列族是相关列的组。它们旨在处理写入繁重的工作负载,并且对于使用已知行键和列键查询数据非常高效。列族 NoSQL 数据库的示例包括 Apache Cassandra 和 HBase。
- 基于图形:这些数据库旨在存储和查询具有复杂关系和互连结构的数据,例如社交网络或推荐系统。图数据库使用节点、边和属性来表示和存储数据,从而更容易执行复杂的遍历和基于关系的查询。基于图形的 NoSQL 数据库的示例包括 Neo4j 和 Amazon Neptune。
12.数据库索引
数据库索引是提高数据库查询操作速度和效率的数据结构。它们的工作方式类似于书中的索引,允许数据库管理系统 (DBMS) 快速定位与特定值或值集关联的数据,而无需搜索表中的每一行。
通过为所需数据提供更直接的路径,索引可以显着减少从数据库检索信息所需的时间。
索引通常建立在数据库表的一个或多个列上。最常见的索引类型是 B 树索引,它以分层树结构组织数据,允许快速搜索、插入和删除操作。
还有其他类型的索引,例如位图索引和哈希索引,每种索引都有其特定的用例和优势。
虽然索引可以显着提高查询性能,但它们也有一些折衷:
- 存储空间:索引会消耗额外的存储空间,因为它们会在原始表数据旁边创建和维护单独的数据结构。
- 写入性能:当在表中插入、更新或删除数据时,关联的索引也必须更新,这会减慢写入操作。
13.分布式文件系统
分布式文件系统是存储解决方案,旨在管理和提供对通常分布在网络上的多个服务器、节点或机器的文件和目录的访问。
它们使用户和应用程序能够像存储在本地文件系统上一样访问和操作文件,即使实际文件可能物理存储在多个远程服务器上。
分布式文件系统通常用于大规模或分布式计算环境,以提供容错、高可用性和改进的性能。
14.通知系统
这些用于向用户发送通知或警报,例如电子邮件、推送通知或短信。
15. 全文搜索
全文搜索使用户能够在应用程序或网站中搜索特定的单词或短语。当用户查询时,应用程序或网站会返回最相关的结果。
为了快速有效地执行此操作,全文搜索依赖于倒排索引,这是一种将单词或短语映射到它们出现的文档的数据结构。
此类系统的一个示例是 Elastic Search。
16.分布式协调服务
分布式协调服务是旨在以可靠、高效和容错的方式管理和协调分布式应用程序、服务或节点的活动的系统。
它们有助于维护一致性、处理分布式同步以及管理分布式环境中各种组件的配置和状态。
分布式协调服务在大规模或复杂系统中特别有用,例如微服务架构、分布式计算环境或集群数据库中的系统。
此类服务的示例有 Apache ZooKeeper、etcd、Consul。
结论
通过使用上述系统设计概念和模板,最大限度地提高系统设计面试的机会。
希望今天这篇文章内容对你有所帮助,感谢你的阅读。