反模式:快取錯誤回應

查看 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>

回應快取政策預設會快取錯誤回應 此外還會從 0 自動調整資源配置 您完全不必調整資源調度設定不過,如果沒有標記錯誤回應,則不建議您快取錯誤回應。 會考量這些負面影響深遠的影響,原因是:

  • 情境 1:錯誤發生於暫時、未知的期間 可以繼續傳送錯誤回應 這是因為該問題已修正

  • 情境 2:系統會在一段固定時間內觀察到失敗情形。 這樣我們就必須修改程式碼,避免在問題解決後快取回應

讓我們詳細說明這兩種情境。

情境 1:後端/資源暫時故障

請考慮出因以下其中一項原因,造成後端伺服器發生錯誤:

  • 網路暫時故障
  • 後端伺服器非常忙碌,無法對 節
  • 要求的後端資源可能暫時遭到移除或無法使用
  • 後端伺服器在暫時性的處理時間過長,因此回應速度緩慢。 其他

在這些情況下,故障期間可能不明,而我們也可能開始 取得成功的回應如果快取錯誤回應,可能會繼續傳送 傳回錯誤回應使用者。

情境 2:推斷或修正後端/資源故障

我們知道後端失敗次數是固定的一段時間。舉例來說: 你知道以下任一項目:

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

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

有了這些資訊,我們就能在回應快取中設定適當的快取到期時間 政策,這樣我們就不會再快取錯誤回應的時間。不過, 及時存取後端伺服器/資源,我們將必須修改政策才能避免快取 錯誤回應。這是因為如果後端發生暫時性/一次性失敗 伺服器,我們會快取回應,並處理上述情境 1 所述的問題。

影響

  • 快取錯誤回應可能會導致系統傳送錯誤回應,即使問題一直都無法傳送 在後端伺服器中解析為
  • 使用者可能為瞭解決問題而花費大量心力,卻不知道 這是因為快取來自後端伺服器的錯誤回應

最佳做法

  • 請勿將錯誤回應儲存在回應快取中。請確認 「<ExcludeErrorResponse>」元素已設為 true ResponseCache 政策可避免系統快取錯誤回應,如以下程式碼所示 程式碼片段。取代為 這項設定只會針對預設成功代碼 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 回應。