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

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

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

永久連線

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

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

您可以透過 API Proxy 的 TargetEndpoint 設定中指定的 keepalive.timeout.millis 屬性,設定保持運作逾時期間。舉例來說,在 TargetEndpoint 中,可將特定後端服務的保持運作時間範圍設為 30 秒。

以下範例在目標端點設定中將 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 Edge 和所有 API Proxy 中所有後端服務之間的保持運作連線行為。

反模式

如要停用永久 (保持運作) 連線,您可以在特定 API Proxy 的目標端點設定中將 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>

如果已停用一或多項後端服務的保持運作連線,Edge 就必須針對傳送至目標後端服務的每個新要求開啟新連線。如果後端是 HTTPS,Edge 也會針對每項新要求執行 SSL 握手,並將 API 要求的整體延遲時間增加。

影響程度

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

最佳做法

  • 後端服務應依據 HTTP 1.1 標準支援並處理 HTTP 永久連線。
  • 如果後端服務能夠處理永久 (保持運作) 連線,則應以 Connection:keep-alive 標頭回應。
  • 如果後端服務無法處理永久連線,則應以 Connection:close 標頭回應。

採用這個模式可確保 Apigee Edge 會自動處理與後端服務的永久或非永久連線,而不需要變更 API Proxy。

其他資訊