反模式:停用 HTTP 永久 (可重複使用的保持運作) 連線

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

API Proxy 是用於用戶端應用程式的介面,用於連線至後端服務。Apigee 提供多種方式,可透過 API Proxy 連線至後端服務:

持久連線

HTTP 永久連線 (也稱為 HTTP 保持運作或 HTTP 連線重複使用) 是一種概念,可讓單一 TCP 連線傳送及接收多個 HTTP 要求/回應,而非為每個要求/回應組合開啟新的連線。

Apigee 會使用永久連線與後端服務通訊。根據預設,連線會維持 60 秒。也就是說,如果連線在連線集區中閒置的時間超過 60 秒,就會關閉連線。

您可以透過名為 keepalive.timeout.millis 的屬性設定保留連線逾時期限,該屬性會在 API Proxy 的 TargetEndpoint 設定中指定。舉例來說,TargetEndpoint 中的特定後端服務可將保活時間設為 30 秒。

在下方範例中,TargetEndpoint 設定中的 keepalive.timeout.millis 設為 30 秒:

<!-- /antipatterns/examples/disable-persistent-connections-1.xml -->
<TargetEndpoint name="default">
  <HTTPTargetConnection>
    <URL>http://mocktarget.apigee.net</URL>
    <Properties>
      <Property name="keepalive.timeout.millis">30000</Property>
    </Properties>
  </HTTPTargetConnection>Disable HTTP persistent (Reusable keep-alive) connections
</TargetEndpoint>

在上例中,keepalive.timeout.millis 會控管 API Proxy 中特定後端服務的保活行為。另外還有一個屬性,可控制所有 Proxy 中所有後端服務的持續運作行為。HTTPTransport.keepalive.timeout.millis 可在訊息處理器元件中設定。此屬性的預設值也是 60 秒。對此屬性進行任何修改,都會影響 Apigee 與所有 API 代理程式中所有後端服務之間的保活連線行為。

反模式

在特定 API Proxy 的 TargetEndpoint 設定中將 keepalive.timeout.millis 屬性設為 0,或在訊息處理器上將 HTTPTransport.keepalive.timeout.millis 設為 0,這會影響效能,因此不建議這麼做。

在下方範例中,TargetEndpoint 設定會將 keepalive.timeout.millis 設為 0,藉此停用特定後端服務的持續 (保持連線) 連線:

<!-- /antipatterns/examples/disable-persistent-connections-2.xml -->
<TargetEndpoint name="default">
  <HTTPTargetConnection>
    <URL>http://mocktarget.apigee.net</URL>
    <Properties>
      <Property name="keepalive.timeout.millis">0</Property>
     </Properties>
  </HTTPTargetConnection>
</TargetEndpoint>

如果一或多個後端服務的保活連線已停用,Apigee 就必須為目標後端服務的每個新要求開啟新連線。如果後端是 HTTPs,Apigee 也會為每個新要求執行 SSL 握手,導致 API 要求的整體延遲時間增加。

影響

  • 由於 Apigee 必須為每個新要求開啟新的連線,並執行 SSL 握手,因此會增加 API 要求的整體回應時間。
  • 在高流量情況下,連線可能會耗盡,因為系統需要一些時間才能將連線釋回。

最佳做法

  • 後端服務應依照 HTTP 1.1 標準,遵循及處理 HTTP 持續連線。
  • 如果後端服務能夠處理持續性 (保持連線) 連線,則應回應 Connection:keep-alive 標頭。
  • 如果後端服務無法處理持續性連線,應以 Connection:close 標頭回應。

實作此模式可確保 Apigee 可自動處理與後端服務的持續性或非持續性連線,而無須變更 API Proxy。

延伸閱讀