发布于 2026-01-06 1 阅读
0

由 Mux 呈现的 Scaling DEV 全球展示挑战赛简介:展示你的项目!

扩展性简介

由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!

在设计软件系统时,可扩展性是首要考虑因素之一。应用程序的创建目标通常是,将来会有大量的用户使用它们。

然而,初始应用程序无需支持大量用户。它需要在必要时进行扩展,但总体上应尽可能保持低成本。让我们分析一下扩展性,以及在需要时实现扩展的两种不同方法。

定义

“可扩展性是指系统根据应用程序和系统处理需求的变化,增加或减少性能和成本的能力。”

—— Gartner

让我们重申一下关键词:

  1. 能力——如前所述,一开始不必非常强大,但应该能够在需要时进化。

  2. 增加或减少——向上并非唯一方向。为了优化成本,成本也需要降低,否则我们将花费更多资源,反而减少利润。

  3. 为了应对需求变化——需求可以分为两部分:用户数量可能增加,我们也需要不时添加新功能。应用程序需要监控用户/功能变化的影响,并据此进行相应的扩展——无论是自动扩展还是手动扩展。

缩放类型

想象一下,你居住的房子(资源)似乎越来越小,无法满足你的需求。随着时间的推移,家里的人口(用户)增加,家具(设施)也随着生活水平的提高而增加。现在,你想扩建房子以提高舒适度。通常有两种选择。

向上

你决定在房子上面加盖一层,问题就解决了。这叫做垂直扩展。用户和功能的位置保持不变,但却拥有了更大的资源支持。这通常相当于向现有服务器添加更多物理资源(CPU/存储/网络升级),使其能够更好地应对不断增长的需求。

然而,你不可能每次需要扩建时都加盖一层。总有一天,房屋的承重能力会成为瓶颈。同样,物质资源的增长也是有限的。让我们来看看解决这个问题的另一种方法。

向外

您决定购买/建造另一套公寓,让部分家庭成员及其物品搬进去。这称为水平扩展。您增加资源,避免所有负载都集中在单个资源上。这可以通过添加功能相似的服务器以及负载均衡器来实现,负载均衡器会将用户请求分配到各个服务器上。

现在,垂直扩张所面临的问题和限制在水平扩张中得到了解决,我们可以购买我们需要的公寓数量(假设公寓有货……但我们暂且不深入思考这个问题)。

虽然从长远来看,水平扩展看起来更好、更高效,但它并不总是两种扩展方式中更容易、也肯定不是更便宜的选择。

我们将对这两种方案进行比较,但在此之前,让我们先了解一下这里要扩展的是什么。

我们正在扩展什么?

应用程序通常由多个软件组件构成。我们称之为分层架构。大多数应用程序都采用某种三层或 N 层架构的变体。如果您想学习/复习这些架构,请查看 Jon Jackson 的这篇帖子。

因此,从N层架构可以看出,应用程序将由多个后端组件支撑。这些组件将被划分为多个层,并且每一层都将与其他层在物理上隔离。

扩展可以分别应用于每个物理层。每个层都可以采用自己的扩展方式,整个应用程序可以混合搭配具有不同扩展能力的组件。

:您可能听说过微服务架构。实际上,单个微服务本身就是一个应用程序,并拥有自己的多层架构。就像一片披萨本身就是一个披萨,包含相同的多层结构一样。

垂直与水平缩放

下面根据一些理想参数对垂直缩放和水平缩放进行比较。

横向扩展的优势

无硬件限制

水平扩展完全没有硬件限制,可以根据需要扩展到任意数量的服务器。而垂直扩展则存在上限。

部署停机时间

单服务器架构意味着部署过程中很可能出现停机。在垂直系统中,由于配备了仅在部署期间使用的备份服务器,因此可以最大限度地减少部署停机时间。然而,在水平系统中,停机时间几乎可以降至零。代码可以分批部署到服务器上,并且在部署期间可以将部分服务器离线,由其他服务器承担负载。

容错性

系统在发生一个或多个组件故障时仍能继续运行(有时性能会降低)的能力称为系统可用性。​​在这方面,横向系统表现更佳。如果一台服务器发生故障,系统只会损失一部分容量,仍能保持完全运行。在故障解决之前,性能可能会有所下降。而纵向系统一旦发生故障,就会彻底崩溃,需要立即修复。

垂直扩展的优势

初始成本

从初始成本来看,垂直扩展似乎更具成本效益。您只需使用绝对必要的资源。此外,您还可以节省其他基础设施方面的大量资金,例如网络、虚拟化技术、负载均衡器,有时甚至包括人员(管理员)成本。

在垂直系统与水平系统的竞争中,成本比较并非易事。如果系统可用性是一个问题,并会导致收入损失,那么垂直系统最终就显得不划算。

维护

多台服务器的维护难度更大。添加负载均衡器后,复杂性进一步增加。需要制定并执行部署策略。

杂项建议

  • 设计时要考虑到应用程序最终需要不断发展。
  • 设计应用程序时,应使其能够在需要时轻松地从一台服务器复制到另一台服务器。
  • 容器化和无服务器解决方案可以降低横向扩展的成本。除非您已经拥有私有基础设施,否则请从云解决方案入手。
  • 后端每一层都必须具备可扩展性。要考虑每个组件——数据库服务器也需要可扩展,而不仅仅是应用程序。

我希望这篇文章能让大家深入了解扩展的必要性以及两种不同的扩展方式。敬请期待后续文章,我们将从以下几个方面探讨扩展:

  1. 监控应用程序以识别扩展需求。
  2. 本文将介绍容器化技术及其如何帮助跨多个服务器部署应用程序。
  3. 设置 Azure 应用服务的自动缩放。

如果你想联系我,可以在Twitter上找到我(DEV和Twitter上的私信都是开放的)。

文章来源:https://dev.to/abh1navv/introduction-to-scaling-1mcj