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

系统设计中的水平扩展与垂直扩展

系统设计中的水平扩展与垂直扩展

声明:本文包含联盟链接;如果您通过本文提供的链接购买产品或服务,我可能会获得佣金。

水平尺度与垂直尺度
图片来源 - DesignGuru.io

各位朋友,我在很多系统设计和Java开发人员面试中都被反复问到的一个问题是:如何扩展系统?特别是如何扩展微服务?

对于任何有经验的开发人员来说,这都是一个很好的问题,因为它是开放式的,既能让应聘者有机会表达自己,也能让面试官更多地了解他们的知识、经验和思维过程。

由于我有阅读博客和文章的习惯,我觉得与我的竞争对手相比,我对新概念和术语的熟悉程度要高一些。

所以,当我第一次被问到高级 Java 开发人员职位的这个问题时,我提到应用程序有两种扩展方式,即水平扩展或垂直扩展,面试官印象非常深刻,因为他自己从未听说过这个术语,尽管他可能熟悉这个概念和过程。

当然,你可以说我运气好,这没错,但我之所以能给人留下深刻印象,是因为我阅读博客和文章,我可以使用流行语,并证明我理解它们。

在本文中,我将告诉你水平缩放和垂直缩放之间的确切区别,以及何时使用其中一种而不是另一种,以便你在面试中给人留下深刻印象。

此外,在过去的几篇文章中,我分享了我关于微服务的经验,例如50 个微服务面试题10 个微服务设计原则10 个微服务模式(我之前也分享过),以及关于SAGA 设计模式和单体架构与微服务架构的文章

现在回到正题,水平扩展和垂直扩展是扩展任何系统(包括微服务)以处理增加的负载或满足性能要求的两种方法。

它们之间的主要区别在于它们实现规模化的方式。

水平扩展,也称为横向扩展,通过添加更多节点或服务器来扩展系统,从而将负载分散到这些节点或服务器之间。

水平扩展是通过向现有系统中添加更多相同的机器来实现的,这样可以更好地分配负载并提高冗余度。

五到十年前,这很困难,因为你必须手动获取服务器并安装所有软件,创建新配置并部署应用程序,但现在在云计算时代以及TerraformAnsiblePuppet等工具的帮助下,你可以轻松地为你的应用程序添加更多机器,而无需太多麻烦。

另一方面,垂直扩展(也称为向上扩展)是指向单个节点或服务器添加更多资源(例如 CPU、RAM 或存储),以处理增加的负载。

这种方法可以提高现有节点的容量,使其能够处理更多请求。

所以,这就是基本区别,稍后我会向你展示更多区别,但如果你在准备微服务面试,这是我希望你学习并更好地理解的一个概念。

顺便一提,如果您正在准备系统设计面试,并且想深入学习系统设计,那么您也可以查看ByteByteGoDesign GuruExponentEducative Udemy 等网站,这些网站有很多很棒的系统设计课程。

您还可以使用像Exponent提供的这种系统设计速查表,以便快速复习关键的系统设计概念,为面试做好准备。

系统设计速查表


系统设计中水平缩放和垂直缩放的区别

以下是区分水平扩展和垂直扩展的一些其他要点:

1. 纵向扩展与横向扩展

垂直扩展是指向单个服务器添加更多资源,而水平扩展是指添加更多实例,这就是为什么垂直扩展现在被称为向上扩展,而水平扩展被称为向外扩展。

微服务中的水平扩展


2. 负载均衡器

水平扩展需要使用负载均衡器将传入请求分配到多个服务器上,而垂直扩展则不需要,这通常是一个决定性因素。如果您的架构不支持负载均衡,那么您只需要进行垂直扩展。

负载均衡器与 API 网关


3. 更高的可扩展性

水平扩展可以实现更高的扩展性,因为节点数量几乎可以无限增加,而垂直扩展由于单个节点或服务器的最大容量而受到限制。


4. 建筑偏好

水平扩展通常与分布式系统相关,而垂直扩展通常与单体系统相关。

软件架构


5. 装卸货物

水平扩展更适合处理不可预测或变化的负载,而垂直扩展更适合处理可预测的负载。


6. 复杂性

水平扩展是指向系统中添加更多节点或服务器以应对不断增长的负载或流量。然而,水平扩展的实现可能比垂直扩展更复杂,因为它通常需要更精细的负载均衡和节点间协调机制。

此外,水平扩展不一定总能带来性能的线性增长,因为增加节点可能会引入更多开销或通信延迟。

另一方面,垂直扩展是指增加单个服务器或实例可用的资源(例如 CPU、RAM 或存储),以处理增加的负载或流量。

垂直扩展的主要优势在于,它通常比水平扩展更容易、更不复杂地实现,因为它只是简单地向现有系统添加更多资源。

然而,垂直扩展性可能受到运行系统的硬件的物理容量的限制,并且可能无法无限扩展。

此外,垂直扩展的成本可能比水平扩展更高,因为它通常涉及升级到更强大或更专业的硬件。


7. 示例

横向扩展的一个例子是使用负载均衡器将传入请求分配到多个 Web 服务器上的 Web 应用程序。随着应用程序流量的增加,可以向集群中添加更多服务器来处理额外的负载。

类似地,垂直可扩展性的一个例子是数据库系统使用分片将数据分区到单个服务器内的多个磁盘或存储设备中。

随着数据库规模的增长,可以向服务器添加额外的存储设备来容纳额外的数据。

使用垂直扩展的数据库分片


横向扩展还是纵向扩展?哪种方式更适合云端微服务?

一般来说,水平扩展对于云端微服务来说更好,因为它允许你添加更多服务实例来处理增加的负载。

通过水平扩展,您可以将工作负载分配到多个实例上,这有助于确保即使一个实例发生故障,服务仍然可用。

此外,水平扩展更具成本效益,因为它允许您根据需要添加资源,而不是要求您预先投资更强大的硬件。

另一方面,垂直扩展可能成本更高、灵活性更差,因为它需要升级单个实例上的资源来处理增加的负载。

如果实例需要离线进行维护或升级,这种方法可能会导致停机,而且可能不足以应对流量的突然激增。

然而,在某些情况下,如果工作负载是可预测的且具有一致性,则垂直扩展可能是合适的,管理一个功能更强大的单个实例可能比管理多个较小的实例更直接。

微服务扩展


系统设计面试准备资源

如果您正在准备系统设计面试,并且想要深入学习系统设计,那么您还可以查看ByteByteGoDesign GuruExponentEducative Udemy 等网站,这些网站有很多优秀的系统设计课程。

此外,如果您需要免费的系统设计课程,还可以查看这篇文章,其中包含大量免费的系统设计课程

系统设计模板
图片来源 - DesignGuru.io

以上就是系统设计和微服务架构中横向扩展和纵向扩展的区别。总的来说,横向扩展和纵向扩展各有优缺点,选择哪种扩展方式取决于所开发系统的具体需求和约束条件。

通常来说,先进行水平扩展,然后根据需要添加更多实例,同时密切关注性能和成本,这是一个不错的做法。

文章来源:https://dev.to/somadevtoo/horizo​​ntal-scaling-vs-vertical-scaling-in-system-design-3n09