反模式:停用 HTTP 持久性(可重复使用的 keep-alive)连接

您正在查看 ApigeeApigee Hybrid 文档。
查看 Apigee Edge 文档。

API 代理是用于连接后端服务的客户端应用的接口。Apigee 通过 API 代理提供了多种方法来连接到后端服务:

持久性连接

HTTP 持久性连接(也称为 HTTP keep-alive或 HTTP 连接重复使用)是一种概念,允许单个 TCP 连接发送和接收多个 HTTP 请求/响应,而不是为每个请求/响应对打开新连接。

Apigee 使用持久性连接与后端服务进行通信。默认情况下,连接保持活动状态 60 秒。也就是说,如果连接在连接池中的空闲时间超过 60 秒,则该连接会关闭。

keep-alive 超时期限可通过 API 代理的 TargetEndpoint 配置中指定的名为 keepalive.timeout.millis 的属性进行配置。例如,对于 TargetEndpoint 中的特定后端服务,您可以将 keep-live 时间段设置为 30 秒。

在以下示例中,keepalive.timeout.millis 在 TargetEndpoint 配置中设置为 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 代理中特定后端服务的 keep-alive 行为。此外,还有一个控制所有代理中所有后端服务 keep-alive 行为的属性。HTTPTransport.keepalive.timeout.millis 可以在消息处理器组件中配置。此属性的默认值是 60 秒。对此属性进行任何修改都会影响 Apigee 与所有 API 代理中所有后端服务之间的 keep-alive 连接行为。

反模式

不建议通过在特定 API 代理的 TargetEndpoint 配置中将属性 keepalive.timeout.millis 设置为 0 或在消息处理器上将 HTTPTransport.keepalive.timeout.millis 设置为 0 来停用持久性(keep-alive)连接,因为这会影响性能。

在以下示例中,TargetEndpoint 配置将 keepalive.timeout.millis 设置为 0,以为特定后端服务停用持久性(keep-alive)连接:

<!-- /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>

如果为一个或多个后端服务停用 keep-alive 连接,则 Apigee 必须为每个目标后端服务的新请求打开新的连接。如果后端是 HTTP,Apigee 还会为每个新请求执行 SSL 握手,从而增加 API 请求的总体延迟时间。

影响

  • 增加 API 请求的总体响应时间,因为 Apigee 必须打开新连接并对每条新请求执行 SSL 握手。
  • 在高流量条件下,连接可能会耗尽,因为将连接撤销到系统需要一些时间。

最佳做法

  • 后端服务应按照 HTTP 1.1 标准遵守和处理 HTTP 持久性连接。
  • 如果后端服务能够处理持久性(keep-alive)连接,则应使用 Connection:keep-alive 标头做出响应。
  • 如果后端服务无法处理持久性连接,则应使用 Connection:close 标头做出响应。

实现此模式可确保 Apigee 可以自动处理与后端服务的持久性或非持久连接,而无需更改 API 代理。

更多详情