可靠性設計原則
服務中斷與故障對於所有工作負載(workload)來說都是嚴重的問題。可靠的工作負載必須要能安然度過任何可能造成服務中斷與故障的事件,並持續穩定提供其原本的功能。可靠的工作負載同時必須具有韌性,以在可接受的時間內偵測、承受故障並恢復運作。最後,可靠的工作負載還必須可用,以便使用者能在約定的期間內以約定的服務品質水準存取工作負載。
假設故障不會發生是不切實際的,特別是當工作負載建置在分散式系統上執行時,是可能發生有些元件故障,而其他元件是可以繼續運作的情況。在某些狀況下,使用者體驗可能會受到影響,因而損害業務目標。
工作負載的架構,應該在程式碼、基礎架構與運作等方面具有可靠性保證。架構設計的選擇不應改變業務需求,因為此類改變應被視為影響程度重大的權衡取捨。
設計原則的目的,是在開發生命週期全程中,指引您考慮到可靠性的各個面向。從建議的方法開始著手,依循設計原則並驗證這樣做所帶來的好處。設定策略之後,請使用可靠性設計檢查清單來推展後續行動。
如果未應用這些原則至您的架構設計中,則可能無法預測或處理正式環境中的問題,結果導致服務中斷或造成財物損失。在關鍵工作負載未應用這些設計原則,可能會危及安全性。
針對業務需求進行設計
目標:收集業務需求,並專注於工作負載的預期作用。
架構設計必須顧及到工作負載的使用者體驗、資料、工作流程以及特性。業務需求必須清楚說明期望架構設計能達成什麼樣的目標與狀態。在指定投資的情況下,目標必須可以實現且經過與團隊協商,記錄下投資是否能實現目標的可行性評估,以及與團隊協商的細節,據以選擇適合的技術、落實到後續營運中。
方法 | 效益 |
---|---|
透過為各個元件、系統流程與系統整體指標訂定目標值,以量化成果。這些目標值是否能提升使用者流程可靠性? | 指標可將期望量化,讓您能了解系統的複雜性,並判斷這些複雜性衍生的成本是否在預算範圍內。目標值表示理想狀態。您可以使用這些值作為測試閾值(threshold),幫助您偵測與理想狀態的差異以及返回目標狀態所需的時間。合規性要求也必須確保範圍內的流程產生可預測的結果。優先考慮這些流程,能讓您關注最重要的領域。 |
了解平台承諾。請考量服務的限制、配額、區域與容量限制。 | 服務水準協議(SLA)視服務而異,並非所有服務與功能的涵蓋範圍都相同,也不是所有服務或功能在所有區域都可以使用。大多數的訂閱資源限制都是按區域劃分。充分了解涵蓋範圍與限制,可以幫助您偵測變動(drift)並建立韌性與復原機制。 |
判斷相依性及其對韌性的影響。 | 追蹤其他團隊或第三方開發的基礎架構、服務、API和功能與工作負載的相依性,有助於您確認工作負載是否能在沒有外部依賴的狀況下運作。它還可以幫助您了解連鎖故障(cascading failures)並改善下游系統的運作。當您使用容易發生故障的外部服務時,開發人員可以採用韌性設計模式(resilient design pattern) 處理可能會發生的故障。 |
韌性導向設計
目標:工作負載必須在完整或減少功能的狀況下繼續運作。
您應該預期會發生元件故障、平台服務中斷、效能下降、資源可用性有限與其他故障。在系統中建立韌性, 使其具有容錯能力並能優雅地降級服務(degrade gracefully)。
方法 | 效益 |
---|---|
區分出關鍵路徑上的元件,以及可處於降級狀態的元件。 | 並非所有工作負載中的元件必須同樣可靠。判斷各元件的重要性,可協助您根據每個元件的關鍵性進行設計。相較於可能只會稍微影響使用者體驗的元件,您會想投入較多心力照顧關鍵元件的韌性,因為如果此關鍵元件發生故障時,可能會造成整個流程的問題(end-to-end problems)。 此設計方法可以將資源有效分配給關鍵元件。同時,您也可以採取故障隔離策略,以便在非關鍵元件發生故障或進入降級狀態時將其隔離,以防止連鎖故障發生。 |
識別系統中的潛在故障點,尤其是關鍵元件,並判斷對使用者流程的影響。 | 您可以分析故障案例、影響範圍與故障程度:是全部中斷或部分中斷。針對元件層級錯誤,設計錯誤處理功能時可參考這些分析結果。 |
透過正確使用設計模式與模組化設計來隔離故障,建立自我保護能力。 | 透過這些設計,系統將能防止問題影響下游元件,並能夠緩解暫時性與永久性故障、效能瓶頸以及其他可能影響可靠性的問題。同時,您也可以儘量將故障的影響範圍縮小到最低限度。 |
透過考量受支 援區域中服務的容量限制,增加關鍵元件(應用程式與基礎架構)的擴展(scale out)能力。 | 工作負載將能處理持續變動的容量高峰值與波動。當系統出現意外負載(例如有效使用量激增)時,這項擴展能力非常關鍵。如果工作負載設計能擴展至多個區域,甚至可以克服潛在的臨時資源容量限制或解決影響單一區域的其他問題。 |
在各個應用層上建立分層與具備韌性的備援。 | 備援可以最大限度地減少單點故障的風險。例如,如果有元件、地區或區域服務中斷,備援部署(active-active 或 active-passive 模式)都能幫助您達成業務持續運作的時間目標。此外,新增媒介服務可以防止元件之間的直接相依性,並改善緩衝處理。這兩個好處都強化了系統的韌性。 |
冗餘布建(overprovision)可透過備援執行個體立即緩解個別執行個體故障帶來的影響,並為失控的資源消耗(runaway resource consumption)提供緩衝(buffer)。 | 對冗餘布建的投資將進一步增強系統韌性。即使在擴展式架構開始修復故障之前,系統仍會在故障尚未排除的期間,維持完整功能運作。此設計還能降低意外狀況耗盡預留的資源餘裕(planned buffer)的風險,並在系統故障或更大規模擴展發生之前,取得關鍵的分級處置時間(critical triage time)。 |