软体设计非功能性特性– 系统设计03

system-design-系统设计03-软体设计非功能性特性-hogantech-hoganblab

序言

在现代软体系统中的非功能性特性包含:可用性(Availability)、可靠性(Reliability)、可扩展性(Scalability)、可维护性(Maintainability)以及容错性(Fault Tolerance),这些特性不仅影响了软体系统的性能、效率,也会直接影响使用者体验。这一篇文章也会针对上述五个特性去做深入讲解。

非功能性特性

在系统设计中,我们大致上可以分成两种需求去做系统设计的规划,分别是功能性需求(Functional Requirement)以及非功能性需求(Non Functional Requirement)。

  • 功能性需求,例如:设计一个影片观看平台,包含使用者登入、上传影片、观看影片…等等功能。
  • 非功能性需求,例如:设计一个影片观看平台,可以负荷百万用户的流量。

这边应该就可以发现无论是功能性或是非功能性的需求都是非常重要的,因此这一篇先来讲讲非功能性需求。

可用性(Availability)

可用性 是指系统服务或系统整体设备,可供使用者拜访和正常运作的百分比。例如,如果一个服务的可用性是100%,则表示该系统的服务随时都能正常运作和回应,白话来说,系统不会坏掉。

可用性的衡量方法

可用性可以用数学的比率来表答,符号为A,值越高越好。我们用以下数学公式表示:

A (百分比) = (总时间– 服务停机时间) / 总时间* 100%

可用性 每年停机时间 每月停机时间 每周停机时间
90% (一个9) 36.5 天 72 小时 16.8 小时
99% (二个9) 3.65 天 7.20 小时 1.68 小时
99.9% (三个9) 8.76 小时 43.8 分钟 10.1 分钟
99.99% (四个9) 52.56 分钟 4.32 分钟 1.01 分钟
99.999% (五个9) 5.26 分钟 25.9 秒 6.05 秒
99.9999% (六个9) 31.5 秒 2.59 秒 0.605 秒
99.99999% (七个9) 3.15 秒 0.259 秒 0.0605 秒

透过上面表格可以知道,我们可以使用可用性百分比来去平判断一个系统的稳定性,通常流量越大的系统会希望可用性比率接近100% ,这样使用者才不会被影响。

可用性影响因素

以下是一些可能影响可用性(Availability)的因素:

  • 硬体故障
  • 软体错误
  • 网路问题
  • 人为错误
  • 自然灾害

系统服务公司通常会采取多种措施来提高可用性,例如:

  • 定期进行维护和测试
  • 实施灾难恢复计划

可靠性(Reliability)

可靠性是服务在指定时间内执行其功能的比率,其中可靠性指标用来衡量系统服务在不同运作条件下的性能。

我们常用「平均故障间隔(MTBF)」 和「 平均修复时间(MTTR) 」来衡量可靠性。

MTBF = 总故障数/ 总经过时间– 故障总和

MTTR = 总维修数/ 总维护时间

(我们追求更高的MTBF 值和更低的MTTR 值。)

可靠性与可用性

可靠性与可用性看起来非常相似,但其实是两个不同个概念。可靠性(Reliability) 和可用性(Availability) 是衡量系统服务是否符合商定的服务水平目标(SLO) 的两个重要指标。可用性着重于时间损失,可靠性着重于而故障的频率。可用性和可靠性两个都是缺一不可,我们可以透过这两个指标来去判断一个系统的稳定性。

可扩展性(Scalability)

可扩展性是指系统在不影响效能的情况下,处理越来越多的工作负载(workload)的能力。例如,影片平台必须要能负荷越来越多的使用者数量以及影片下载、播放量。

工作负载(workload)可以是不同类型的,包括以下几种:

  • 请求负载(request workload):这是系统处理的请求数量。
  • 资料/储存负载(data/storage workload):这是系统储存的资料量。

维度(Dimensions)

可扩展性(Scalability) 有不同的维度:

  • 规模可扩展性(Size Scalability): 规模可扩展性是指我们可以向系统增加更多使用者和资料。
  • 管理可扩展性(Administrative scalability): 管理可扩展性是指越来越多的使用者可以轻松共享单个分散式系统的能力。
  • 地理可扩展性(Geographical scalability): 地理可扩展性是指程式在效能限制的情况下,如何轻松地服务于其他地区。白话来说,系统可以跨不同国家、不同时区使用,并且效能事不会影响太多了。

不同的可扩展性

我们通常提到可扩展性,可以分为两种:

垂直扩展(Vertical Scaling \ Scaling Up)

垂直扩展是指现有伺服器的装置进行升级,例如:提供更多CPU 或RAM 来进行扩展。垂直扩展可以让我们扩展伺服器的记忆体容量、效能,但针对电脑的升级还是有一个上限,没办法针对设备去做无限的升级,并且垂直扩展的成本通常很高。

水平扩展(Horizontal Scaling \ Scaling Out)

水平扩展是指透过网路连线,增加的伺服器数量。白话来说,如果系统需要做扩充,就继续增加伺服器的数量,并且透过网路来做连线以及传输,这样的好处是成本比较低。

可维护性(Maintainability)

除了架构软体系统之外,我们也需要针对系统去做维护,而这个可维护性是指系统可以修复错误、添加新功能、保持系统平台更新以及确保顺畅的系统运作来维持系统的正常运行。

可维护性的概念可以进一步细分为三个基本方面:

  1. 可操作性(Operability): 指在正常情况下确保系统运作顺畅并能在故障时恢复到正常状态的难易度。
  2. 清晰性(Lucidity): 指程式码的复杂性。在系统中的程式码越简洁明了,就越容易理解和维护,反之亦然。
  3. 可修改性(Modifiability): 指系统能够轻易的整合经过修改的新功能。

如何衡量可维护性(Maintainability)

可维护性是服务在发生故障后指定时间内恢复功能的机率。我们也可以使用可维护性指标,衡量服务恢复正常操作条件的方便性和快速程度。

例如,假设一个系统元件在半小时内的可维护性95%。在这种情况下,系统元件在半小时内恢复到完全正常状态的机率为0.95。我们使用平均修复时间(MTTR) 作为测量M 的指标。

MTTR = 总维修数/ 总维护时间

换句话说,MTTR 是修复和恢复故障元件所需的平均时间。我们的目标是希望MTTR 的值下降。

容错性(Fault Tolerance)

什么是容错性?

现实世界的大型应用程式通常会有数百台伺服器和资料库,用以接受数十亿使用者的请求并储存大量资料。这些应用程式也需要一种机制来帮助确保资料安全,并通过避免单点故障(single point of failure)来避免重新进行高强度的程式运行。

容错性(Fault Tolerance)是指即使一个或多个系统元件发生故障,系统仍能持续执行的能力。在这边,系统元件可以是软体或硬体,不过实务上,要设计一个完全容错的软体系统实际上非常困难。

容错性技术

如果故障发生在硬体或软体,最终会影响资料。可以通过多种技术以及方法实现容错性,不过还是取决于我们的系统结构。

  • 复制(Replication): 这是使用最广泛的容错性技术之一。尤其是在资料库也都会使用此技术,我们可以复制伺服器和资料,当系统的某一个私服器故障,直接自动转换成复制的伺服器,这样的系统再遇到故障时,不会影响使用者。
  • 检查点(Checkpointing): 检查点是一种将系统状态备份到资料库中,方便日后在发生错误或服务故障时快速检查。当分散式系统发生故障时,我们可以从之前的检查点获得当时的资料,来让工程师去做修复。

结论

这篇文章讲讲了,系统的可用性(Availability)、可靠性(Reliability)、可扩展性(Scalability)、可维护性(Maintainability)以及容错性(Fault Tolerance)等重要概念。

  1. 可用性(Availability)代表系统对使用者的可用程度
  2. 可靠性(Reliability)代表系统发生故障的可能性
  3. 可扩展性(Scalability)代表系统处理工作负载(workload)的能力
  4. 可维护性(Maintainability)代表系统的易维护程度
  5. 容错性(Fault Tolerance)代表系统抵御故障的能力。

理解这些概念并采用合适的技术可以帮助开发人员构建更可靠、更高效、更易于使用的系统。

以下是提高系统可用性、可靠性、可扩展性、可维护性以及容错性的一些建议:

  • 采用冗余设计: 通过使用多个系统元件或节点来提高系统的容错性。
  • 进行定期维护: 定期检查和更新系统以防止故障发生。
  • 使用可扩展的架构: 设计能够轻松扩展以满足不断增长的使用者需求或资料量的系统。
  • 采用成熟的技术: 使用经过验证和可靠的技术来提高系统的稳定性。
  • 进行全面测试: 在部署系统之前进行彻底的测试,来发现和修复潜在的问题。
zh_CN简体中文