軟體設計非功能性特性 – 系統設計 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_TW繁體中文