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