反模式:快取錯誤回應

您正在查看 ApigeeApigee Hybrid 說明文件。
查看 Apigee Edge 說明文件。

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

  • 可更快速地擷取資料
  • 避免重複產生資料,進而縮短處理時間
  • 避免 API 要求命中後端伺服器,進而降低後端伺服器的額外負擔
  • 可提高系統/應用程式資源的使用效率
  • 改善 API 的回應時間

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

Apigee 可在執行階段將資料儲存在快取中,以便持續存在並加快擷取速度。快取功能可透過 PopulateCache 政策LookupCache 政策InvalidateCache 政策ResponseCache 政策 使用。

在本節中,我們將說明回應快取政策。Apigee 平台中的「Response Cache」政策可讓您快取來自後端伺服器的回應。如果用戶端應用程式會重複要求相同的後端資源,且該資源會定期更新,我們就能使用這項政策快取這些回應。回應快取政策有助於傳回快取的回應,因此可避免不必要地將要求轉送至後端伺服器。

回應快取政策:

  • 減少傳送至後端的要求數量
  • 減少網路頻寬
  • 改善 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:暫時性錯誤發生的時間不明,即使問題已修正,我們仍可能因快取而持續傳送錯誤回應。

    OR

  • 情況 2:系統會在一段固定時間內觀察失敗情形,然後在問題修正後修改程式碼,以免快取回應

我們將進一步說明這兩種情況。

情境 1:暫時性後端/資源失敗

請考慮後端伺服器發生失敗的原因可能是下列其中一個原因:

  • 暫時性網路故障
  • 後端伺服器非常忙碌,暫時無法回應要求
  • 要求的後端資源可能會暫時移除/無法使用
  • 後端伺服器因暫時性處理時間過長等因素而回應緩慢

在所有這些情況下,失敗可能會發生在未知的時間範圍內,然後我們可能會開始收到成功的回應。如果我們快取錯誤回應,即使後端伺服器的問題已修正,我們仍可能繼續向使用者傳送錯誤回應。

情境 2:後端/資源失敗問題持續或已修正

假設我們知道後端發生失敗的時間長度。舉例來說,您知道以下任一情況:

  • 特定後端資源將無法使用 1 小時

    OR

  • 後端伺服器因網站突然故障、調整問題、維護或升級等原因而移除/無法使用 24 小時。

有了這些資訊,我們就能在「Response Cache」政策中適當設定快取到期時間,避免將錯誤回應快取太久。不過,一旦後端伺服器/資源再次可用,我們就必須修改政策,避免快取錯誤回應。這是因為如果後端伺服器發生暫時性/一次性失敗,我們會快取回應,並最終導致上述情境 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 回應。