REL05-BP01 實作適度降級,以將適用的硬相依性轉換為軟相依性 - 可靠性支柱

REL05-BP01 實作適度降級,以將適用的硬相依性轉換為軟相依性

即使相依性變得不可用,應用程式元件仍應繼續執行其核心功能。它們有可能提供稍微陳舊的資料、備用資料,甚至未提供任何資料。這可確保整體系統運作在本地化失敗時只會受到最低限度的阻礙,同時提供核心商業價值。

預期成果:當元件的相依性狀況不良,元件本身仍可運作,但以降級的方式運作。元件的失敗模式應被視為正常運作。工作流程應適當設計,使此類失敗不會導致完全失敗,或至少會進入可預測和可復原的狀態。

常見的反模式:

  • 未識別所需的核心業務功能。即使在相依性失敗期間,也不測試元件是否正常運作。

  • 發生錯誤時,或只有多個相依性的其中之一無法使用,且仍可傳回部分結果時,就不提供資料。

  • 當交易部分失敗時建立不一致的狀態。

  • 沒有替代方法可存取中央參數存放區。

  • 因重新整理失敗而使本機狀態失效或清空,而未考量這麼做的後果。

建立此最佳實務的優勢:按正常程序降級可改善系統整體的可用性,並且讓最重要的功能保持運作,即使在失敗期間亦然。

未建立此最佳實務時的曝險等級:

實作指引

按正常程序實作降級,有助於將相依性失敗對元件功能的影響降到最低。理想情況下,元件會偵測相依性失敗,並以對其他元件或客戶造成最小影響的方式解決這些問題。

按正常程序降級的架構,意味著在相依性設計期間會考量潛在的失敗模式。對於每種失敗模式,都有一種方法可至少將元件最關鍵的功能提供給呼叫者或客戶。這些考量可能會成為可供測試和驗證的其他要求。理想情況下,即使有一或多個相依性失敗,元件仍然能夠以可接受的方式執行其核心功能。

這在商業上和技術上都同樣值得討論。所有業務要求都很重要,都應盡可能地滿足。然而,若無法滿足各項要求將會如何,仍是值得提出的問題。一個系統可以設計成可用且一致的,但在必須放棄一項要求的情況下,何者較重要? 對於付款處理,可能應選擇一致性。對於即時應用程式,可能應選擇可用性。對於面向客戶的網站,答案可能取決於客戶的期望。

這意味著什麼,取決於元件的要求,以及應將哪些內容視為其核心功能。例如:

  • 電子商務網站可能會顯示來自多個不同系統的資料,例如個人化推薦、排名最高的產品,以及客戶訂單在登陸網頁上的狀態。當一個上游系統失敗時,顯示其他所有內容,而不是向客戶顯示錯誤頁面,仍然是合理的。

  • 如果個別作業之一失敗,執行批次寫入的元件仍然可以繼續處理批次。實作重試機制應該要很簡單。為此,您可以向呼叫者傳回關於哪些操作成功、哪些操作失敗及其為何失敗的資訊,或將失敗的請求放入無效字母佇列以實作非同步重試。失敗操作的相關資訊也應記錄下來。

  • 處理交易的系統必須確認是否執行了所有更新,或完全未執行更新。對於分佈式交易,可使用 Saga 模式在相同交易的後續操作失敗的情況下回復先前的操作。在此,核心功能保有一致性。

  • 具時間性的系統應該能夠處理未及時回應的相依性。在這類情況下,可以使用斷路器模式。若來自相依性的回應開始逾時,系統可以切換到不會進行其他呼叫的關閉狀態。

  • 應用程式可從參數存放區讀取參數。使用一組預設的參數建立容器映像,並在參數存放區無法使用時使用這些參數,會很有效用。

請注意,在元件失敗的情況下採取的路徑需進行測試,且應遠比主要途徑簡單。一般來說,應避免使用備用策略

實作步驟

識別外部和內部相依性。請考量其中可能會發生什麼樣的失敗。思考在這類失敗期間,將上游和下游系統以及客戶受到的負面影響降到最低的方法。

以下列出相依性,並說明如何在其失敗時按正常程序降級:

  1. 相依性的部分失敗:一個元件可能會向下游系統提出多個請求,可以是對一個系統的多個請求,或者對多個系統各提出一個請求。視業務環境而定,對此可能會有不同的適當處理方式 (如需詳細資訊,請參閱實作指引中的先前範例)。

  2. 下游系統因高負載而無法處理請求:如果對下游系統的請求一直失敗,則繼續重試是沒有意義的。這樣可能會對已過載的系統產生額外的負載,並使復原變得更加困難。此時可以使用斷路器模式,以監控對下游系統的失敗呼叫。若有大量呼叫失敗,將會停止向下游系統傳送更多請求,且偶爾才會讓呼叫通過,以測試下游系統是否已恢復可用性。

  3. 參數存放區無法使用:若要轉換參數存放區,可以使用容器或機器映像中包含的軟相依性快取或有效的預設值。請注意,這些預設值需要保持最新狀態,並包含在測試套件中。

  4. 監控服務或其他非功能性相依性無法使用:如果元件間歇性地無法傳送記錄、指標或追蹤給中央監控服務,最好還是照常執行業務功能。一般而言,長時間不日誌記錄或推送指標且未顯示任何訊息,是不可接受的。此外,某些使用案例可能需要完整的稽核項目才能滿足合規要求。

  5. 關聯式資料庫的主要執行個體可能無法使用:Amazon Relational Database Service 與幾乎所有關聯式資料庫一樣,只能有一個主要寫入器執行個體。這會對寫入工作負載造成單一失敗點,並使擴展變得更加困難。透過使用多可用區域組態以獲得高可用性,或使用 Amazon Aurora Serverless 以獲得更好的擴展性,可以減輕部分問題。對於非常高的可用性要求,完全不依賴主要寫入器是有效用的。對於唯讀的查詢可以使用讀取複本,以提供備援和橫向擴充的能力,而不僅僅是縱向擴展。寫入可以緩衝處理 (例如,在 Amazon Simple Queue Service 佇列中),如此,即使主要寫入器暫時無法使用,仍然可以接受客戶的寫入請求。

資源

相關文件:

相關影片:

相關範例: