可扩展性问题:系统发展过程中隐藏的挑战
到目前为止,本系列文章主要关注分布式系统背后的技术和概念。我们还探讨了如何在分布式系统之后保持其高效运行,并了解了系统扩展的不同维度。
但是,一旦我们理解了系统为何需要扩展,并确定了系统应该扩展的方式,我们该如何实际操作呢?事实证明,正如系统扩展的维度不同,实际扩展的方法也各有不同。但在思考如何扩展系统的过程中,一些意想不到的、隐藏的问题很可能会从地毯下探出来(很常见,对吧?)。
任何系统扩展的难点在于,一旦我们真正开始着手扩展,就不可避免地会遇到一些隐藏的复杂性。既然我们已经熟悉了可扩展性能够帮助我们解决的场景,那么现在是时候深入探讨在真正开始扩展时我们可能需要思考和处理的问题了。在这个过程中,我们会发现这是一个需要考虑的复杂过程,一路上会遇到一些坎坷!最终,在后续的文章中,我们会思考这些问题的一些解决方案;但首先,让我们看看我们正在处理什么。
扩展问题
在之前的一篇文章中,我们了解到衡量系统可扩展性的主要方法有三种,我们称之为可扩展性的三个维度:规模可扩展性、地理可扩展性和管理可扩展性。简单回顾一下,这三个维度有效地确保了:随着用户和资源数量的增长、资源之间物理距离的扩大以及系统管理开销的变化,系统本身的速度不会因此而变慢或性能下降。
然而,我们尚未深入探讨这些维度在尝试扩展系统时可能带来的一些问题。每个系统都有其自身的局限性,我们在尝试扩展时必须应对这些局限性。今天,我们将讨论两个主要局限性:集中化和同步通信。

如果我们回想一下我们对规模可扩展系统的了解,我们会记得,随着用户或资源数量的增加,我们的系统需要能够处理这种涌入。但是,如果我们的系统是集中式的,或者位于/受单一中心位置控制,那么我们可能会遇到一些问题。如果一个系统是集中式的,那么在尝试使其规模可扩展时就会面临一些限制。
类似地,如果我们的系统使用同步通信,那么在尝试使我们的系统具有地理可扩展性时,我们会遇到一些问题。
同步通信是节点或资源之间的一种通信方式;在这种情况下,每当一个节点向另一个节点发出请求时,它都会“阻塞”(这意味着它会一直等待,不做任何其他事情),直到收到响应为止。我们许多人都处理过客户端-服务器模型形式的同步通信,其中客户端是信息的“请求者”,并等待“被请求者”(即服务器)做出响应。
我们会记得,地理上可扩展的系统即使其用户和/或资源之间的距离增加也能正常运行;但是,如果系统依赖于同步通信,则在尝试确保系统可以在地理上扩展时可能会导致问题。
但是,为什么这两个系统特性会在我们尝试扩展系统时造成如此多的阻碍呢?让我们更深入地探讨一下,在尝试扩展时,集中化和同步通信会带来哪些问题,以及是什么让它们难以处理。
当一个节点拥有过多的控制权时
集中式系统可以有多种不同的形式:它可能是负责运行系统的单个服务器或机器,或者(更有可能)是一组聚集在同一物理位置(例如数据中心)的机器,作为一个整体协同工作。在这两种情况下,系统的主控和位置都位于一个“中心”位置,因此被称为集中式系统。
但是,当单个服务器或一组服务器位于一个地方时,就会出现一些隐藏的问题,只有当系统规模扩大时,这些问题才会开始显现出来。
集中式系统将受到主要控制源处理能力的限制。

想象一下,我们的系统只是一台机器上的单台服务器。如果我们的单服务器集中式系统突然收到大量请求,会发生什么?假设我们的单服务器系统每秒大概可以处理 100 个请求;如果它突然开始每秒接收 10,000 个请求,那么它实际上能做的就有限了。无论我们的设置如何,只要有足够多的请求,我们就会达到集中式系统的计算极限。
处理请求也是如此;如果我们的系统必须处理大量数据(例如,必须同时写入或更新单个数据库),它将不可避免地遇到存储限制;在给定时间内实际上只能访问或写入这么多数据,如果超出了系统存储限制的界限,我们可能无法像我们期望的那样保存所有数据。
最后,还有网络问题。当我们的系统集中并由单点控制时,我们更加依赖用户和集中式服务器之间的网络来确保其始终高效运行。然而,网络可能会出现故障,变得不可靠,有时甚至并非我们自身的过错!集中式系统的网络限制意味着,如果我们的服务器和用户之间出现问题,整个系统可能会延迟,甚至更糟,无法使用。
鉴于我们已知的可扩展性,我们知道我们希望系统能够随着规模的扩大而扩展。然而,即使是最先进、最现代的中心化系统也存在局限性。如果我们发现需要使系统规模可扩展,那么如果系统设计为中心化,我们可能会遇到一些其他限制。
当你等待节点回复消息时
同步通信并非完全糟糕;事实上,有时同步通信效果非常好。系统各部分之间的通信实际上取决于它们使用的网络类型。
例如,如果一个系统的节点都位于同一栋建筑内,那么它们之间传递的信息就不需要传输那么远。然而,如果一个系统的节点相距较远(例如,位于国家的不同地方),情况就完全不同了。我们刚才描述的两种网络都有专门的术语来指代它们。

所有节点都位于同一栋建筑物或一个等小区域内的网络称为局域网(LAN)。另一方面,节点分布更广,遍布全国甚至不同大洲的网络称为广域网(WAN)。LAN 网络非常适合在物理距离较近的机器之间传输少量信息;而 WAN 更适合在物理距离较远的机器之间传输大量数据。
那么,这两个网络究竟如何与同步通信联系起来呢?我们回想一下,同步通信意味着请求节点必须等待被请求节点以某种方式做出响应。
最终,围绕局域网构建的系统在将其同步通信用于广域网时会遇到问题。
如果我们更深入地思考这个问题,就会发现其中的道理:当所有节点都在本地网络上,并且它们之间的通信不需要传输太远时,一个节点在等待另一个节点响应时“阻塞”可能不会那么明显。当我们的资源都在局域网内运行时,等待一个进程同步完成的速度可能非常快。然而,当我们系统的节点距离进一步拉远时——例如,如果我们添加一个本地网络之外的节点,并使用广域网——请求和响应之间的“阻塞”时间可能会变得非常慢(甚至只是明显慢!)。

另一个与广域网同步通信速度缓慢相关的问题是,广域网通常不如局域网可靠,可能会出现故障、中断,或者可用性或带宽有限。如果我们的系统使用同步通信,那么很可能在某个时刻,当一个资源阻塞并等待另一个资源的响应时,网络本身也可能会故障。
鉴于我们已经了解的地理可扩展性,我们知道,如果我们通过添加新节点来扩展系统,即使节点之间的物理距离较远,系统的性能也应该能够保持相似。然而,如果我们的系统设计为使用同步通信,那么从地理角度来看,它可能无法像我们希望的那样扩展。
所以,我们或许明白了,扩展并非像“添加另一台服务器”或“增加数据库节点大小”那么简单。事实证明,我们必须仔细思考系统的设置方式,以及在扩展时是否需要更改系统的架构。扩展并非易事(我们甚至还没有涵盖扩展的所有问题——只提到了两个大问题!),但只要深思熟虑并运用一些实用技巧,还是有可能实现的。
在下一篇文章中,我们将了解在有效扩展分布式系统时可以使用的一些工具,以及如何管理最难以控制的系统的不可预见的增长突增!
资源
可扩展性是一个备受关注且研究颇深的话题!你可以从中了解更多有关集中式系统和同步通信的问题。如果你对此感兴趣,这里有一些很棒的资源可以作为入门参考。
- 分布式系统简介,Maarten van Steen 和 Andrew S. Tanenbaum
- 关于系统可扩展性,Charles Weinstock 和 John Goodenough
- 分布式系统的乐趣和利润,Mikito Takada
- 分布式系统简介(讲义),童来宇博士
鏂囩珷鏉ユ簮锛�https://dev.to/vaidehijoshi/scalability-problems-hidden-challenges-of-forming-a-system-1f68