什么是软件可扩展性,为什么您的公司应该认真对待它?

已发表: 2023-08-01

即使是经验丰富且成功的公司也会在可扩展性方面遇到麻烦。 您还记得迪士尼的掌声应用程序吗? 它使用户能够与不同的迪士尼节目互动。 当该应用程序出现在 Google Play 上时,非常受欢迎。 但可扩展性不太好。 它无法应对大量粉丝,导致用户体验不佳。 人们非常愤怒,在 Google Play 上留下了负面反馈和一星评级。 该应用程序从未从这种负面宣传中恢复过来。

如果您在开发的早期阶段关注软件的可扩展性,无论您自己实现还是使用软件工程服务,都可以避免此类问题。

那么,什么是软件的可扩展性呢? 如何确保您的解决方案具有可扩展性? 什么时候需要开始扩展?

什么是软件可扩展性?

Gartner 将可扩展性定义为衡量系统响应处理需求变化而降低或提高性能和成本的能力。

在软件开发的背景下,可扩展性是应用程序处理工作负载变化的能力,同时以最低的成本添加或删除用户。 因此,可扩展的解决方案预计在工作负载急剧增加(无论是预期的还是自发的)后保持稳定并保持其性能。 工作量增加的例子有:

  • 许多用户同时访问系统
  • 存储容量需求的扩大
  • 正在处理的交易数量增加

软件可扩展性类型

您可以水平或垂直缩放应用程序。 让我们看看每种方法的优点和缺点是什么。

软件水平可扩展性(横向扩展)

您可以通过将额外的节点合并到系统中来水平扩展软件以处理更高的负载,因为它将分布在计算机上。 例如,如果应用程序开始遇到延迟,您可以通过添加另一台服务器进行扩展。

当您无法估计应用程序将来需要处理多少负载时,水平可扩展性是更好的选择。 对于需要快速扩展且无需停机的软件来说,它也是首选。

好处:

  • 对失败的韧性。 如果一个节点发生故障,其他节点将接替它
  • 扩展期间没有停机时间,因为在添加新节点时无需停用现有节点
  • 理论上,水平扩展的可能性是无限的

限制:

  • 增加了复杂性。 您需要确定工作负载如何在节点之间分配。 您可以使用 Kubernetes 进行负载管理
  • 成本较高。 添加新节点的成本高于升级现有节点的成本
  • 整体软件速度可能会受到节点通信速度的限制

垂直软件可扩展性(扩展)

垂直可扩展性是指为现有硬件添加更多功能。 如果通过水平可扩展性,您需要添加另一台服务器来处理应用程序的负载,那么您将通过添加更多处理能力、内存等来更新现有服务器。另一种选择是删除旧服务器并连接更先进、功能更强大的服务器。

当您知道需要合并的额外负载量时,这种可扩展性类型效果很好。

好处:

  • 无需更改配置或应用程序的逻辑即可适应更新的基础架构
  • 降低费用,因为升级成本低于添加另一台机器的成本

限制:

  • 升级过程中有停机时间
  • 升级后的机器仍然存在单点故障
  • 一台设备的升级数量有限制

软件的垂直与水平可扩展性

下面是一个表格比较,概述了两种软件可扩展性类型的不同方面。

什么时候你绝对需要可扩展性?

许多公司放弃了软件工程的可扩展性,转而支持降低成本和缩短软件开发生命周期。 尽管在某些情况下可扩展性并不是一个重要的系统质量属性,但在大多数情况下,您需要从产品生命周期的早期阶段就考虑它。

当不需要软件可扩展性时:

  • 如果该软件是概念验证 (PoC) 或原型
  • 为小公司开发仅供员工使用的内部软件时
  • 没有后端的移动/桌面应用程序

对于其余的,强烈建议研究可扩展性选项,以便在时机成熟时做好准备。 您怎么知道是时候进行扩展了? 当您注意到性能下降时。 以下是一些迹象:

  • 应用程序响应时间增加
  • 无法处理并发用户请求
  • 错误率增加,例如连接失败和超时
  • 瓶颈经常形成。 无法访问数据库、身份验证失败等。

构建高度可扩展的软件的技巧

如果在软件开发之初就考虑到的话,软件可扩展性会更便宜且更容易实现。 如果您在实施过程中未采取必要的步骤而必须意外扩展,则该过程将消耗更多的时间和资源。 其中一种方法是重构代码,这是一项重复的工作,因为它没有添加任何新功能。 它只是做了开发过程中应该做的事情。

下面您可以找到八个技巧,它们将帮助您构建未来更容易扩展的软件。 下表将技巧分为不同的软件开发阶段。

提示#1:选择在云中托管以获得更好的软件可扩展性

您有两种选择来托管应用程序:在云中或在本地。 或者您可以使用混合方法。

如果您选择本地模型,您将依赖自己的基础设施来运行应用程序、容纳数据存储等。这种设置将限制您的扩展能力并使其更加昂贵。 但是,如果您在受到严格监管的行业运营,您可能别无选择,因为本地托管可以让您更好地控制数据。

此外,在某些行业(例如银行业),交易处理时间至关重要,您不能等待云响应或容忍云提供商的任何停机。 在这些行业中运营的公司仅限于使用特定的硬件,并且不能依赖云提供商提供的任何服务。 对于时间敏感、关键任务的应用程序(例如自动驾驶汽车)也是如此。

选择云计算服务将使您能够访问第三方资源,而不是使用您的基础设施。 借助云,您几乎可以无限地扩展和缩小规模,而无需投资服务器和其他硬件。 云供应商还负责维护和保护基础设施。

如果您在医疗保健行业工作,可以查看我们关于医疗行业云计算的文章。

技巧#2:使用负载平衡

如果您决定水平扩展,则需要部署负载平衡软件,以在所有能够处理请求的设备之间分配传入请求,并确保没有服务器被淹没。 如果一台服务器出现故障,负载均衡器会将服务器的流量重定向到可以处理这些请求的其他在线计算机。

当连接新节点时,它将自动成为设置的一部分,并且也将开始接收请求。

技巧#3:尽可能多地缓存

缓存用于存储静态内容和预先计算的结果,用户可以访问而无需再次进行计算。

缓存尽可能多的数据以减轻数据库的负载。 配置处理逻辑,以便可以从分布式缓存中检索很少更改但经常读取的数据。 这比使用每个简单请求查询数据库更快、更便宜。 此外,当某些内容不在缓存中但经常访问时,您的应用程序将检索它并缓存结果。

这就带来了一些问题,比如应该多久让缓存失效,一条数据需要访问多少次才能复制到缓存等等。

提示 #4:通过 API 启用访问

最终用户将通过各种客户端访问您的软件,并且提供每个人都可以用来连接的应用程序编程接口(API)将会更加方便。 API 就像一个中介,允许两个应用程序进行对话。 确保考虑到不同的客户端类型,包括智能手机、桌面应用程序等。

请记住,API 可能会让您面临安全漏洞。 尝试在为时已晚之前解决这个问题。 您可以使用安全网关、强身份验证、加密方法等。

技巧 #5:从异步处理中受益

异步进程是可以在后台执行任务的进程。 客户无需等待结果,可以开始处理其他事情。 该技术支持软件可扩展性,因为它允许应用程序运行更多线程,从而使节点更具可扩展性并处理更多负载。 而且如果有耗时的任务进来,也不会阻止执行威胁,应用程序仍然能够同时处理其他任务。

异步处理还涉及将进程分散为多个步骤,如果这对系统来说并不重要,则无需等待一个步骤完成即可开始下一个步骤。 这一设置允许将一个进程分布在多个执行线程上,这也有利于可扩展性。

异步处理是在代码和基础设施级别实现的,而异步请求处理是代码级别的。

提示#6:如果可能,选择更容易扩展的数据库类型

有些数据库比其他数据库更容易扩展。 例如,NoSQL 数据库(例如 MongoDB)比 SQL 更具可扩展性。 前面提到的 MongoDB 是开源的,通常用于实时大数据分析。 其他 NoSQL 选项包括 Amazon DynamoDB 和 Google Bigtable。

SQL 在扩展读取操作时表现良好,但由于其符合 ACID 原则(原子性、一致性、隔离性和持久性),它在写入操作上表现不佳。 因此,如果这些原则不是主要关注点,您可以选择 NoSQL 以更轻松地扩展。 如果您需要依赖关系数据库来实现一致性或任何其他问题,仍然可以使用分片和其他技术进行扩展。

提示#7:如果适用,选择微服务而不是整体架构

整体架构

单体软件被构建为一个结合了客户端和服务器端操作、数据库等的单个单元。一切都紧密耦合,并且其所有功能都有一个单一的代码库。 您不能只更新一部分而不影响应用程序的其余部分。

可以扩展整体软件,但必须使用垂直扩展方法进行整体扩展,这是昂贵且低效的。 如果您想升级特定部分,就无法避免重建和重新部署整个应用程序。 因此,如果您的解决方案并不复杂并且仅由有限数量的人使用,请选择整体式解决方案。

微服务架构

微服务比单体应用更灵活。 以这种风格设计的应用程序由许多协同工作但独立部署的组件组成。 每个组件都提供特定的功能。 构成一个应用程序的服务可以具有不同的技术堆栈并访问不同的数据库。 例如,构建为微服务的电子商务应用程序将具有一项用于产品搜索的服务,另一项用于用户配置文件的服务,还有一项用于订单处理的服务,等等。

微服务应用程序组件可以独立扩展,而不会对整个软件造成负担。 因此,如果您正在寻找可扩展的解决方案,微服务是您的首选设计。 高软件可扩展性只是您可以从此架构中获得的众多优势之一。 有关更多信息,请查看我们关于微服务优势的文章。

提示 #8:监控性能以确定何时进行扩展

部署后,您可以监控软件以捕获性能下降的早期迹象,这些迹象可以通过扩展来解决。 这使您有机会在问题升级之前做出反应。 例如,当您注意到内存不足或消息等待处理的时间超过指定限制时,这表明您的软件正在以其容量运行。

为了能够识别这些以及其他与软件可扩展性相关的问题,您需要在编码阶段将遥测监控系统嵌入到您的应用程序中。 该系统将使您能够跟踪:

  • 平均响应时间
  • 吞吐量,即给定时间处理的请求数
  • 并发用户数
  • 数据库性能指标,例如查询响应时间
  • 资源利用率,例如CPU、内存使用、GPU
  • 错误率
  • 每用户成本

您可以受益于现有的监控解决方案和日志聚合框架,例如 Splunk。 如果您的软件在云端运行,您可以使用云供应商的解决方案。 例如,Amazon 为此提供了 AWS CloudWatch。

ITRex 产品组合中的可扩展软件解决方案示例

配备私人教练的智能健身镜

项目介绍

客户想要制作一面全长壁式健身镜,以帮助用户进行日常锻炼。 它可以在锻炼期间监控用户的状态、计算重复次数等等。 该系统应该包含允许培训师创建和上传视频以及用户记录和管理他们的锻炼的软件。

我们为确保软件的可扩展性所做的工作

  • 我们选择微服务架构
  • 实现了负载分配的水平可扩展性。 每当现有节点负载过多时,就会添加新节点。 因此,每当 CPU 使用率超过其容量的 90% 并持续一段指定的时间时,就会添加一个新节点来缓解负载。
  • 出于架构原因,我们必须部署关系数据库(即 SQL 和 PostgreSQL)。 尽管关系数据库更难扩展,但仍然有多种选择。 一开始,由于用户基数还比较小,我们选择了纵向扩展。 如果受众越来越多,我们计划部署主从方法——将数据分布在多个数据库中。
  • 由于该系统包含大量静态信息,例如教练姓名、锻炼标题等,因此从缓存中受益匪浅。
  • 使用 RestAPI 在锻炼应用程序和服务器之间进行异步请求处理
  • 依赖无服务器架构(例如 AWS Lambda)进行其他类型的异步处理。 异步视频处理就是一个例子。 培训师加载新的锻炼视频并将其分割成不同的练习后,他们按下“保存”,服务器开始处理该视频以进行 HTTP 实时流传输,以构建具有不同分辨率的原始视频的四个版本。 培训师可以同时上传新视频。
  • 在另一个示例中,系统对用户视频进行异步智能修剪,以删除用户不活动的任何部分。

基于生物识别技术的网络安全系统

项目介绍

客户希望建立一个网络安全平台,使企业能够根据生物识别技术对员工、承包商和其他用户进行身份验证,并避开密码和 PIN。 该平台还将包含一个实时视频工具,用于远程确认用户身份。

我们如何确保该软件具有可扩展性

  • 我们使用了去中心化的微服务架构
  • 部署三个负载均衡器以在不同的微服务之间分配负载
  • 该平台的某些部分在设计上是可自动扩展的。 如果负载超过某个阈值,则会自动创建微服务的新实例
  • 我们使用了六个不同的数据库——四个 PostgreSQL 和两个 MongoDB。 PostgreSQL 数据库在需要时可以垂直扩展。 在设计架构时,我们意识到某些数据库必须经常扩展,因此我们为此采用了 MongoDB,因为它们更容易水平扩展。
  • 部署异步处理以获得更好的用户体验。 例如,视频后处理是异步完成的。
  • 我们选择了第三方服务提供商的面部识别算法。 因此,我们确保选择一个已经可扩展的解决方案,并通过 API 将其合并到我们的平台中。

扩展时可能遇到的挑战

如果您打算在应用程序开发过程中规划软件可扩展性并希望采用上述技巧,您仍然可能面临以下挑战:

  • 积累的技术债务。 项目利益相关者可能仍然试图放弃可扩展性,以支持更低的成本、速度等。可扩展性不是功能性需求,可能会被更具体的特征所掩盖。 结果,应用程序将积累与可扩展性不兼容的技术功能。
  • 使用敏捷开发方法进行扩展。 敏捷方法论就是拥抱变化。 然而,当客户想要频繁地实施太多更改时,可以为了适应不断变化的需求而搁置软件可扩展性。
  • 可扩展性测试。 执行实际的负载测试很困难。 假设您想要测试如果将数据库大小增加 10 倍,系统将如何运行。 您将需要生成大量与原始数据特征相匹配的真实数据,然后为写入和读取生成真实的工作负载。
  • 第三方服务的可扩展性。 确保您的第三方服务提供商不会限制可扩展性。 选择技术供应商时,请验证他们是否能够支持预期的软件可扩展性水平,并正确集成其解决方案。
  • 了解您的应用程序的用途。 您需要清楚地了解您的软件将如何工作以及有多少人将使用它,而这几乎不可能精确估计。
  • 架构限制。 有时您的架构选择受到限制。 例如,您可能需要使用关系数据库,并且必须处理水平和垂直扩展。
  • 拥有合适的人才。 为了设计一个将来不会让您头疼的可扩展解决方案,您需要一位经验丰富的架构师,之前曾从事过类似项目,并且从编码和基础设施的角度了解软件可扩展性。 在 ITRex Group,我们参与过许多项目,并且在软件开发过程中始终牢记可扩展性。

总结

除非您绝对确定不需要扩展,否则请在开发的早期阶段考虑软件的可扩展性并采取必要的预防措施。 即使您的架构选择受到限制并且无法始终实现最具可扩展性的选项,您仍然会知道障碍在哪里,并且有时间考虑替代方案。

为了其他功能需求而放弃可扩展性将会适得其反。 首先,公司将面临业绩下降的困境。 处理请求将花费太长时间。 用户将经历不可接受的延迟。 完成这一切之后,该公司将支付两倍或三倍于早期阶段可能支出的金额。

考虑部署新的企业软件或更新现有系统,但担心它无法跟上快速增长的业务需求? 保持联系! 我们将确保您的软件不仅具有所需的所有功能,而且可以以最少的投资和停机时间进行扩展。


最初于 2023 年 7 月 24 日发布于https://itrexgroup.com