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

您正在查看的是 Apigee Edge 文档。
转到 Apigee X 文档
信息

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

持久性连接

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

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

keep-alive 超时期限可通过 API 代理的 TargetEndpoint 配置中指定的名为 keepalive.timeout.millis 的属性进行配置。例如,对于 TargetEndpoint 中的特定后端服务,您可以将 keep-live 时间段设置为 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 代理中特定后端服务的 keep-alive 行为。此外,还有一个控制所有代理中所有后端服务 keep-alive 行为的属性。HTTPTransport.keepalive.timeout.millis 可以在消息处理器组件中配置。此属性的默认值是 60 秒。对此属性进行任何修改会影响 Apigee Edge 与所有 API 代理中的所有后端服务之间的持久连接行为。

反模式

不建议通过在特定 API 代理的 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>

如果一项或多项后端服务的保持活跃连接已停用,那么 Edge 必须为目标后端服务的每个新请求打开一个新连接。如果后端是 HTTPS,Edge 还会为每个新请求执行 SSL 握手,这样会增加 API 请求的总体延迟时间。

影响

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

最佳做法

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

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

深入阅读