在水平和垂直扩展之间做出决定是构建应用程序时的一个重要的基础设施考虑,因为它决定了你的应用程序将如何增加其计算资源以处理增长。
简单地说,水平和垂直扩展是两种策略,随着需求的增加,增加计算资源来运行你的应用程序。
术语 "水平扩展 "意味着你根据需要添加更多的机器;你曾有一台服务器运行你的应用程序,现在你有几台并行运行。术语 "垂直扩展 "描述的是在现有机器上增加动力;你有一台服务器,然后增加更多的内存和CPU资源。
在服务器扩展方面做出错误的决定可能会使你每月的服务器成本增加数万美元;或者更糟糕的是,导致你的应用程序在重负载下崩溃或变慢。
作为一名经理,了解水平和垂直扩展策略之间的区别将有助于你与你的工程团队成员进行合作。在围绕以下方面做决定时,做出正确的选择可能是至关重要的:
- 微服务vs单体系统设计
- 云平台和成本
- 数据库结构和开发人员的偏好
横向扩展和混合方法更受欢迎,但仍有一些情况下,纵向扩展更有意义,特别是对于内部应用或小型和低成本的项目。
横向扩展与纵向扩展:快速入门
在非技术贡献者中,一个常见的误解是,可扩展性决定会影响你为项目选择什么样的框架或语言。
事实上,允许应用程序扩展的技术都发生在后端架构方面,即用于运行应用程序的服务器和用于与数据库交互的语言。
你可以这样想象:一旦你建立了一个软件,你需要一个硬件来运行它。任何用户行为,如登录或更新账户,都需要一个服务器来接收用户请求并返回完成请求所需的数据。
当你增加用户时,请求就会增加,到了一定程度,服务器将很难快速处理这些请求。
在这一点上,服务器需要进行扩展;或者通过增加更多的服务器来进行横向扩展,或者通过增加现有服务器的功率来进行纵向扩展。
应用程序前端使用的框架(例如ReactJS)往往并不重要;可扩展性几乎完全是一个后端能力问题,它往往与驱动应用程序扩展能力的基础设施脱钩。
应用程序中的高质量代码对于高效运行至关重要,但即使是经过完美调整的应用程序,当它从几百个并发用户扩展到数百万时,也需要增加服务器的功率。
在选择数据库时,经常会出现水平和垂直扩展之间的选择。一些数据库,如MongoDB,被设计成更适合在分布式架构上运行(水平扩展),而其他数据库,如MySQL,在垂直扩展模型上运行得更好。
关于应用程序可扩展性的常见误解
回顾一下,以下是非技术贡献者在团队讨论中遇到可扩展性时最常见的误解:
- 误解:选择正确的应用平台对支持一百万用户很重要。**在大多数情况下,Ruby on Rails vs Flask不是一个可扩展性问题,而是一个开发者的舒适度问题。如果没有足够的服务器能力来支持所有的用户,任何应用程序都将难以执行。在优化服务器成本方面,你可能会从Flask应用中得到更多的 "实惠",但这两个框架都完全有能力扩展到一百万用户甚至更多--如果在后端配上正确的基础设施的话。
- 误解:选择一个糟糕的云平台会限制你的扩展性。**像AWS和微软Azure这样的云供应商只是一种虚拟购买服务器能力的方式,而不是在你的柜子里有物理服务器。在99.9%的情况下,它们同样能够处理高规模的应用程序。
- 误解:一百万用户账户需要一百万美元的AWS费用。**一百万个用户账户,如果他们不同时使用应用程序,或者应用程序有非常简单的、轻度的请求负载,就可以由一个小型服务器来处理。一个同时有很多并发用户的应用比一个有一百万用户但只是偶尔打开的应用需要更多的服务器能力。
横向扩展与纵向扩展的概述
| 架构考虑 | 水平扩展 | 垂直扩展 |
| 流量管理 | 负载平衡器 | 手动升级(停机时间) |
| 对停电的恢复能力 | 高:多个服务器和自动升级,如果其中一个出现故障 | 低:单点故障,需要停机时间来进行修改 |
| 数据一致性 | 低:服务器之间的数据一致性可能有问题(分片考虑)。 | 高:所有数据都在一个地方 |
| 用户群限制 | 实际上,只受购买更多服务器的经济能力限制 | 单台机器的硬件限制 |
| 数据库程序 | MongoDB, Casandra | 亚马逊RDS、MySQL |
水平扩展与垂直扩展:哪个更受欢迎?
横向扩展几乎总是比纵向扩展更受欢迎,因为它的弹性更大。
构建能够水平扩展的软件往往要复杂一些。所以,有时候,对于小型应用来说,构建单体设计(不太可能水平扩展),并根据需要进行垂直扩展,是比较便宜的。在达到一定的门槛后,垂直扩展的成本就会急剧上升。

横向扩展常见于内部应用和地方政府网站或服务,他们在构建网络应用时倾向于使用更传统的单体架构。
另外,很多时候,你会发现,即使是横向扩展,每台服务器也会遇到一些限制(内存、CPU等)。这时就需要通过垂直扩展来升级其处理能力。
水平与垂直扩展:优点和缺点
在我们讨论水平扩展和垂直扩展的利弊之前,请注意水平扩展是迄今为止快速增长和企业应用最常见的选择。
虽然水平服务器架构总体上更加复杂,通过引入负载均衡器来处理请求和在多个服务器之间 "分片 "数据,但其回报是,如果用户数量超过预期,它可以自动扩展。它对随机的硬件故障也更有弹性,这意味着如果一台服务器死了,另一台可以自动配置来接替空缺的部分。
也有例外,但在大多数情况下,根据需求迅速扩大计算资源而不停机的能力使水平扩展成为最明智的选择,特别是对于面向消费者的应用。
横向扩展的优点和缺点
横向扩展的主要优点是:
- 自动增加服务器以配合使用
- 停机时间短,服务器升级时不需要停机
- 对随机的硬件故障有弹性
横向扩展的主要缺点是:
- 多台机器之间的数据一致性可能是个挑战(连接需要跨服务器通信)
- 成本可能更高,可能需要更多的代码
- 如果机器太小,服务器仍可能遇到硬件限制问题
纵向扩展的优点和缺点
纵向扩展的主要优点是:
- 简单,因为所有的东西都在一台机器上运行(假设你不是在水平架构中垂直扩展的机器)
- 降低服务器成本
- 更少的数据一致性问题,因为数据都在一台机器上。
- 要扩展到更大的机器,需要的代码改动相对较少
纵向扩展的主要缺点是:
- 通常需要手工操作来升级到更大的机器
- 服务器变化带来的停工期
- 如果硬件发生故障,很容易出现停机。
总结:纵向扩展与横向扩展的优点和缺点
| 特点 | 纵向 | 横向 |
| 复杂性 | 相对简单,因为所有数据都在一台机器上 | 需要负载平衡器和管理数据一致性的代码 |
| 成本 | 倾向于较低 | 往往较高 |
| 处理快速增长 | 手动,不灵活 | 自动,灵活 |
| 数据一致性 | 不是一个问题 | 可以是一个问题 |
| 停机时间 | 服务器变更时的停机时间 | 高弹性,低停机时间 |
| 脆弱性 | 易受随机硬件故障的影响 | 不易受硬件故障的影响 |
横向扩展的混合体
在许多情况下,是横向扩展还是纵向扩展的问题并不是一个非黑即白的选择。
"混合 "扩展越来越受欢迎,特别是在云平台使机器的配置变得简单而经济。
简单地说,混合扩展意味着在水平架构中使用较大的服务器;这对快速增长的消费类初创企业和SaaS公司来说是有意义的,他们可以利用大型机器的优势,而不牺牲水平方式的灵活性。
图片:一排排的大型服务器
微服务架构的水平扩展与垂直扩展
微服务应用架构在2021年越来越受欢迎。它们的流行有两个主要原因。
- 微服务允许开发人员独立构建应用程序中资源最密集或高流量的部分,这使得它们相对于扩展整个应用程序来说,可以直接扩展。
- 微服务允许应用程序的功能被抽象化,这样它们就可以使用不同的语言独立构建,甚至可以外包给第三方。
微服务架构通常出现在大型、高需求的横向扩展系统中,如Netflix、Uber和Amazon。然而,他们实际上能够对如何扩展应用程序的每个部分进行更多的选择。
举个例子,假设你有一个带有聊天功能的应用程序,你发现聊天功能的使用量正在爆炸性增长--远远超出了你的假设。与此同时,你的应用程序的其他部分,如应用内商店,却没有得到大量使用。
横向扩展的微服务架构可以让您迅速增加为应用程序的聊天组件提供动力的服务器。同时,商店组件可以保持原样,甚至可以根据需要缩小规模,以减少服务器成本。
横向与纵向扩展对Facebook广告意味着什么?
在Facebook广告购买的背景下,横向扩展意味着通过相似受众或新的地理区域向外扩展活动。纵向扩展是指增加单个活动预算的支出。该术语与软件架构和系统设计中的横向扩展与纵向扩展的使用没有关系。
横向扩展和分布式系统是一回事吗?
分布式系统的某些组件可能包含水平扩展,但它们不是一回事。分布式系统中的节点通过网络直接通信,而水平扩展是指在负载均衡器后面的多个克隆机器实例。
横向扩展与纵向扩展是什么意思?
术语 "水平扩展 "意味着你根据需要添加更多的机器;你曾有一台服务器运行你的应用程序,现在你有几台。术语 "垂直扩展 "是指在现有的机器上增加动力;你有一台服务器,你增加更多的内存和CPU资源。