反模式:快取錯誤回應

您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件
資訊

快取是將資料暫時儲存在稱為「快取」的儲存空間區域,以供日後參考。快取資料可帶來顯著的效能優勢,因為:

  • 加快資料擷取速度
  • 避免一再重新產生資料,進而縮短處理時間
  • 避免 API 要求觸及後端伺服器,藉此降低後端伺服器負擔
  • 提高系統/應用程式資源的使用率
  • 改善 API 的回應時間

每當我們必須存取不常變更的資料時,強烈建議您使用快取來儲存這類資料。

Apigee Edge 可將資料儲存在執行階段的快取中,以便保存資料並加快擷取速度。快取功能是透過 PopulateCache 政策LookupCache 政策InvalidateCache 政策ResponseCache 政策提供。

本節將介紹「回應快取」政策。Apigee Edge 平台中的回應快取政策可讓您快取來自後端伺服器的回應。如果用戶端應用程式重複對相同的後端資源發出要求,且資源會定期更新,我們可以使用這項政策快取這些回應。回應快取政策有助於傳回快取的回應,因此在不必要的情況下會將要求轉送至後端伺服器。

回應快取政策:

  • 減少傳送至後端的要求數量
  • 降低網路頻寬
  • 改善 API 效能和回應時間

反模式

根據預設,ResponseCache 政策可讓您快取包含任何可能狀態碼的 HTTP 回應。這表示系統可快取成功和錯誤回應。

以下是採用預設設定的回應快取政策範例:

<!-- /antipatterns/examples/1-1.xml -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ResponseCache async="false" continueOnError="false" enabled="true" name="TargetServerResponseCache">
  <DisplayName>TargetServer ResponseCache</DisplayName>
  <CacheKey>
    <Key Fragment ref="request.uri" /></CacheKey>
    <Scope>Exclusive</Scope>
    <ExpirySettings>
      <TimeoutInSec ref="flow.variable.here">600</TimeoutInSec>
    </ExpirySettings>
  <CacheResource>targetCache</CacheResource>
</ResponseCache>

回應快取政策會在預設設定中快取錯誤回應。不過,如果您未審慎思考要快取的錯誤,則不建議快取錯誤回應,原因如下:

  • 情境 1:失敗的期間暫時不明,即使問題已修正,我們可能還是會繼續傳送錯誤回應

  • 情境 2:系統會將錯誤觀察到固定的一段時間,因此必須修改程式碼,避免在問題修正後快取回應

以下將詳細說明這兩種情況。

情境 1:暫時後端/資源發生錯誤

請考慮後端伺服器失敗的原因可能為下列其中一項:

  • 網路暫時故障
  • 後端伺服器忙碌中,暫時無法回應要求
  • 要求的後端資源可能暫時遭到移除/無法使用
  • 由於暫時性的處理時間過長,後端伺服器的回應速度相當慢

在以上所有情況下,失敗都可能發生未知的時間範圍,之後我們就能開始取得成功回應。如果快取錯誤回應,那麼即使後端伺服器的問題已修正,我們可能仍會繼續傳送錯誤回應給使用者。

情境 2:先前發生或固定的後端/資源故障

請注意,後端失敗是固定的一段時間。舉例來說,您會知道:

  • 每項後端資源將暫停 1 小時

  • 由於網站突然故障、資源調度問題、維護、升級等,該後端伺服器會遭到移除/無法使用 24 小時。

有了這項資訊,我們就能在回應快取政策中適當設定快取到期時間,這樣我們就不會長時間快取錯誤回應。但當後端伺服器/資源再次可用時,我們必須修改政策,以免快取錯誤回應。這是因為如果後端伺服器發生暫時性/一次性失敗,我們就會快取回應,最後就會發生在上述情境 1 中說明的問題。

影響程度

  • 即使在後端伺服器中解決問題後,快取錯誤回應仍可能會導致傳送錯誤回應
  • 使用者可能會花費大量心力來排解問題,但不知道這是從後端伺服器快取錯誤回應所造成的原因

最佳做法

  • 請勿將錯誤回應儲存在回應快取中,請確認 ResponseCache 政策中的 <ExcludeErrorResponse> 元素設為 true,以免系統快取錯誤回應,如以下程式碼片段所示。使用這項設定時,系統只會快取預設成功代碼 200 至 205 的回應 (除非成功修改成功代碼)。
    <!-- /antipatterns/examples/1-2.xml -->
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ResponseCache async="false" continueOnError="false" enabled="true" name="TargetServerResponseCache">
      <DisplayName>TargetServerResponseCache</DisplayName>
      <CacheKey>
        <KeyFragment ref="request.uri" />
      </CacheKey>
      <Scope>Exclusive</Scope>
      <ExpirySettings>
        <TimeoutinSec ref="flow.variable.here">600</TimeoutinSec>
      </ExpirySettings>
      <CacheResource>targetCache</CacheResource>
      <ExcludeErrorResponse>true</ExcludeErrorResponse>
    </ResponseCache>
    
  • 如果您因某些特定原因而必須快取錯誤回應,可以判斷偵測失敗的最長/確切時間長度 (如有):
    • 請適當設定到期時間,確保快取錯誤回應的時間不超過故障可見時間的時長。
    • 使用 ResponseCache 政策,快取不含 <ExcludeErrorResponse> 元素的錯誤回應。

    請僅在確定後端伺服器故障不會短暫/暫時性時,才採取這種做法。

  • Apigee 不建議從後端伺服器快取 5xx 回應。