软件系统的架构设计经验很难获得。即便工作多年,能够完成系统架构设计的机会也很有限。如何提高自己的系统架构设计能力呢?不断实践当然不可或缺,思维实验或许也是一种有效的方式。
一般地,在深入架构设计之前,充分理解问题及其需求是至关重要的。花点时间澄清任何模棱两可的地方,并确保自己对系统的范围和目标有一个清晰的理解。对问题的澄清不要犹豫,用自己的话重申问题,以确认你的理解。在确定解决方案之前,采取分步骤的方法来分析问题,确定关键组件,并探索不同的设计选择。
在整个设计过程中始终牢记可伸缩性、可靠性和性能,并准备好这些因素相关的权衡和优化,积极主动地讨论折衷方案和设计选择背后的理由。只有了解系统架构设计的复杂性,才可能做出明智的决定。
本文初步列举了在系统架构设计中的10个常见知识点,并使用思维实验的方式尝试系统设计。这样的刻意练习或许可以起到一定的辅助效果。
缓存是位于应用程序和原始数据源(如数据库、文件系统或远程 Web 服务)之间的高速存储层。当应用程序请求数据时,首先会在缓存中检查数据。如果在缓存中找到数据,则将其返回给应用程序。如果在缓存中找不到数据,则从其原始源检索数据,存储在缓存中以供将来使用,并返回给应用程序。在分布式系统中,缓存可以在多个地方完成,例如客户端、DNS、CDN、负载均衡器、API 网关、服务器、数据库等。
键值存储用于快速、可伸缩的数据存储和检索,像Redis等流行的键值存储系统那样,通常用于缓存、会话管理和实时分析。
实验步骤:
这些问题可以提升设计可伸缩、高效和可靠系统的能力。理解每个问题中涉及的关键概念和权衡是非常重要的,并且需要梳理自己的思维过程。
内容分发网络(CDN)是一种分布式服务器网络,其服务器部署在世界各地的多个位置。这些服务器旨在根据用户的地理位置向他们提供网络内容,例如图像、视频和其他静态文件。CDN的主要目标是通过将网络内容缓存在离请求它的用户更近的服务器上来提高网络内容的性能和可用性。
使用CDN技术可以提高网站和应用程序的性能,因为它可以显著缩短数据传输时间。当用户从远程服务器请求内容时,网络延迟和其他因素可能会导致较慢的加载时间,这可能会对用户体验产生负面影响。但是,CDN可以通过将内容缓存在距离用户更近的服务器上来解决这一问题,从而提供更快的响应时间和更快的页面加载速度。
除了提供更快的页面加载速度以外,CDN还可以提高网站和应用程序的可用性。当内容被缓存在多个服务器上时,如果其中一个服务器出现故障或过载,其他服务器可以继续提供内容。这可以确保网站或应用程序在面对高流量或服务器故障时仍然可用。
著名的CDN企业大概是Akamai,如今各个公有云提供商也都在提供CDN服务,致力于缓存和服务来自最终用户附近的边缘服务器的内容,提高性能和减少延迟。
实验步骤:
这些步骤可以帮助我们提高管理缓存一致性和优化内容交付的能力,并在资源分配方面做到更好的平衡。
负载均衡器是一种网络设备,通过多个后端服务器或服务分配传入的网络流量以提高系统的性能和可用性。负载平衡器通常位于客户机和服务器之间,并使用各种算法在可用服务器之间分发传入请求,以最大限度地提高性能并确保没有单个服务器不堪重负。这可以提高系统的整体可靠性和响应能力,因为它可以更均匀地分配工作量,并使系统能够处理更大量的请求。
与负载均衡易混淆的概念是“网络代理”,分为三类:前向代理、反向代理和透明代理。透明代理容易理解,现简要介绍一下前向代理和反向代理。前向代理是位于一台或多台客户机前的服务器,充当客户机和互联网之间的中介。当客户端机器向 Internet 上的资源发出请求时,请求首先发送到代理。然后,前向代理代表客户端机器将请求转发到 Internet,并将响应返回给客户端机器。反向代理是位于一个或多个网络服务器之前的服务器,充当网络服务器和互联网之间的中介。当客户端向 Internet 上的资源发出请求时,请求首先被发送到反向代理。反向代理然后将请求转发给其中一个 Web 服务器,后者将响应返回给反向代理。最后,反向代理将响应返回给客户端。
亚马逊和其他云平台的 ELB 是基于云的负载平衡器,它们能够自动地在多个服务器之间分配传入流量,以确保高可用性和容错性。
实验步骤:
这些步骤有助于我们提升在多服务器网络流量分配的能力,同时确保高可用性和容错性。
API 网关是现代应用程序中不可或缺的组件,它提供了一种简化和管理微服务架构的方法。API网关充当着整个应用程序的入口点,通过接收客户端请求并将它们转发到适当的微服务,然后将服务器的响应返回给客户端,为整个应用程序提供了一个单一的入口点。这种架构可以使应用程序更加模块化和可扩展,同时也可以提供更好的性能和安全性。
除了提供请求路由和分发功能之外,API网关还可以用于执行其他重要的任务,如身份验证、速率限制和缓存。身份验证是一种保护微服务免受未经授权的访问的方法,可以防止恶意用户或攻击者访问受保护的资源。速率限制是一种控制访问速率的方法,可以防止应用程序的资源被过度使用,从而保护应用程序的稳定性和可靠性。缓存是一种提高应用程序性能的方法,可以避免频繁地从后端服务中检索数据。
在现代应用程序中,API网关已成为一个必不可少的组件。它不仅提供了一种更加模块化和可扩展的方式来构建应用程序,还可以提供更优良的性能和安全性。因此,选择一个适当的API网关是非常关键的。有许多API网关可供选择,如Kong、Tyk和Apigee等。这些API网关都有自己的优点和缺点,需要根据应用程序的需求进行选择。
流量控制对于保护系统免受大量请求的影响至关重要。像 Amazon API Gateway 这样的服务提供了可伸缩速率限制功能,这些功能可以保护 Web 应用程序和 API 免受过度请求和滥用。
实验步骤:
这些问题有助于提升我们对分布式系统和技术(例如令牌桶算法等)的理解。关于令牌桶算法,它是一种常见的流量控制算法,它可以帮助我们限制对服务的请求速率,从而保护服务免受过度请求而崩溃的风险。除此之外,分布式系统的理解是非常重要的,因为它已经成为了现代计算机科学中不可或缺的一部分,而它的重要性只会随着时间的推移而增加。
DNS是一个分层的分布式系统,它由多个服务器组成,这些服务器协同工作以将人类可读的域名(比如www.abc.com)转换为IP地址(比如192.168.1.128)。计算机需要使用这些地址在互联网或私有网络上相互识别。
DNS的主要目的是通过使用有意义和容易记忆的域名,而不是必须记住数字IP地址,使用户更容易访问网站和其他网络资源。DNS还有其他一些功能,例如它可以帮助网络管理员诊断和解决网络问题,以及提供对于DNS查询的安全保护。
DNS还可以通过将一个域名映射到多个IP地址,实现负载均衡和故障转移,以确保网络服务的高可用性。此外,DNS还支持迭代和递归查询,以确保客户端能够得到最准确和最快速的响应。
bit.ly 和 goo.gl 是流行的 URL 缩短服务,它们生成独特的短 URL,提供解析,并有效地将用户重定向到原始 URL。
实验步骤:
这些问题有助于我们提升设计一个服务的能力,这个实验可以为更长的 Web 地址生成短的、唯一的 URL。关键概念包括散列、数据库设计和 API 开发。
在数据库中,水平分区(也称为分片)涉及将表的行划分为更小的表,并将它们存储在不同的服务器或数据库实例中。这样做是为了在多个服务器之间分配数据库的负载并提高性能。垂直分区涉及到将表的列划分为单独的表。这样做是为了减少表中的列数,并提高只访问少量列的查询性能。
水平分区的目标是将数据和工作负载分布在多个服务器之间,这样每个服务器可以处理总数据和工作负载中较小的一部分。这有助于提高数据库的性能和可伸缩性,因为每个服务器在处理较少量数据时可以更有效地处理查询和更新。主要的分区方法如下:
数据库复制是将数据从一个数据库复制并同步到一个或多个其他数据库的过程。这通常在分布式系统中使用,需要多个副本来确保数据的可用性、容错性和可伸缩性。
国内的微博以及国外的Twitter和Facebook都是大型社交媒体平台的典范。它们处理用户注册、关系、发帖和时间线的生成,同时管理大量数据和流量。
实验步骤:
这个问题将考验我们在设计可伸缩和容错系统方面的技能。
分布式文件系统是一种非常流行的存储解决方案,它可以在多台服务器、节点或机器之间分布式地管理和提供对文件和目录的访问。这些服务器、节点或机器通常通过网络分布,因此用户和应用程序可以访问和操作文件,就好像它们存储在本地文件系统上一样。这种存储解决方案在现代计算机系统中变得越来越重要,特别是在大规模或分布式计算环境中,以提供容错、高可用性和改进性能。
分布式文件系统有许多不同的实现方式,例如Hadoop分布式文件系统(HDFS)、GlusterFS、Ceph等,每种实现方式都有其独特的优点和限制。HDFS是Apache Hadoop项目的一部分,它是一个开源的、高度可伸缩的分布式文件系统,旨在提供高吞吐量和数据访问性能,适用于大规模数据应用程序。GlusterFS是一个开源的、分布式的文件系统,它允许用户在不同的计算节点上存储和访问文件,是一种高度可扩展的存储解决方案。Ceph是一个分布式的、统一的、可扩展的文件系统和对象存储解决方案,旨在提供容错性、高可用性和良好的性能。
分布式文件系统对于跨多台机器存储和管理大量数据至关重要。HDFS与S3是广泛使用的分布式文件系统,旨在跨多台机器存储和管理大量数据,同时提供高可用性和容错能力。
实验步骤:
这些问题有助于更深入地理解分布式系统中的数据复制和一致性模型,以及它们在现实世界中的应用。我们可以探讨如何应对可能出现的数据冲突和错误,并如何在数据复制和一致性模型方面进行创新,以满足未来的需求。
分布式协调服务是用于以可靠、高效和容错的方式管理和协调分布式应用程序、服务或节点活动的系统。它们有助于维护一致性,处理分布式同步,以及管理分布式环境中各种组件的配置和状态。此外,分布式协调服务还可以提供诸如负载均衡、故障转移和安全性等附加功能。因此,在大规模或复杂的系统中,例如微服务架构、分布式计算环境或集群数据库中的服务,分布式协调服务的重要性与日俱增。
API 速率限制对于维护 Web 服务的稳定性和安全性至关重要。GitHub 和 Baidu Maps API 等就是这样一些服务的例子,它们实现了 API 速率限制,以保持稳定性和安全性,同时允许开发人员在指定的限制内访问资源。
实验步骤:
这些问题可以加深我们对 API 设计、基于令牌的身份验证和速率限制算法的理解。
分布式消息传递系统支持以可靠、可伸缩和容错的方式在多个可能分散在不同地理位置的应用程序、服务或组件之间交换消息。它们通过解耦发送方和接收方组件来促进通信,允许它们独立进化和操作。分布式消息传递系统在大规模或复杂的系统中特别有用,另外,作为一种特殊的分布式消息系统,通知系统用于向用户发送通知或警报,如电子邮件、推送通知或文本消息。
微信,飞书, 钉钉等都是在线聊天系统的例子,它们支持实时消息、群聊和离线消息传递,同时通过端对端加密确保安全和隐私。
实验步骤:
这些问题的关键考虑因素包括消息存储、数据同步和高效的通信协议。
全文搜索是一种在应用程序或网站中搜索特定单词或短语的功能。当用户在搜索框中输入查询时,应用程序或网站将返回最相关的结果,以帮助用户快速找到所需内容。为了有效地实现这一功能,全文搜索使用了一种称为倒排索引的数据结构,该结构将单词或短语映射到其出现在哪些文档中。Elasticsearch是一个使用这种技术的搜索引擎的例子,它提供了强大的搜索功能和可扩展性,可以轻松地处理大量的数据。
一个网络爬虫被用来从网站中提取信息并为搜索引擎建立索引。Google和百度等搜索引擎都使用了网络爬虫,它们根据网站的相关性和受欢迎程度等各种因素对网站进行数据采集、索引和排名。
实验步骤:
这些问题可以帮助我们更深入地理解网络技术、并行处理和数据存储方面的知识。我们可以通过研究网络协议来了解网络技术的工作原理,而并行处理可以帮助我们提高计算效率和处理大量数据的能力。另外,数据存储方面的问题也是我们必须要深入了解的领域,因为数据的处理和存储对于许多领域都非常重要,包括人工智能、大数据和云计算等等。
“刻意练习”,本文介绍了10个系统架构设计的思维实验,包括分布式文件系统、服务协调控制、API网关、分布式消息系统和全文检索等。每个实验都包括了步骤和关键考虑因素,涉及到的技术包括数据分区、缓存、长连接、网络爬虫和分布式计算框架等。