Antipatrón: Inhabilita las conexiones HTTP persistentes (keep-alive reutilizable)

Estás consultando la documentación de Apigee Edge.
Consulta la documentación de Apigee X.
Información

Un proxy de API es una interfaz para aplicaciones cliente que se usan a fin de conectarse con servicios de backend. Apigee Edge proporciona varias formas de conectarse a los servicios de backend a través de un proxy de API:

Conexiones persistentes

La conexión HTTP persistente, también llamada keep-alive HTTP o reutilización de conexión HTTP, es un concepto que permite que una sola conexión TCP envíe y reciba varias solicitudes HTTP o respuestas, en lugar de abrir una conexión nueva para cada par de solicitud o respuesta.

Apigee Edge usa una conexión persistente para comunicarse con los servicios de backend. Una conexión permanece activa durante 60 segundos de forma predeterminada. Es decir, si una conexión está inactiva en el grupo de conexiones durante más de 60 segundos, la conexión se cierra.

El tiempo de espera del keep-alive se puede configurar a través de una propiedad llamada keepalive.timeout.millis, especificada en la configuración de TargetEndpoint de un proxy de API. Por ejemplo, el período del keep alive se puede establecer en 30 segundos para un servicio de backend específico en el TargetEndpoint.

En el siguiente ejemplo, keepalive.timeout.millis se establece en 30 segundos en la configuración de TargetEndpoint:

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

En el ejemplo anterior, keepalive.timeout.millis controla el comportamiento de keep-alive para un servicio de backend específico en un proxy de API. También existe una propiedad que controla el comportamiento de keep-alive para todos los servicios de backend en todos los proxies. Se puede configurar HTTPTransport.keepalive.timeout.millis en el componente Message Processor. Esta propiedad también tiene un valor predeterminado de 60 segundos. Las modificaciones en esta propiedad afectan el comportamiento de la conexión de mantenimiento en vivo entre Apigee Edge y todos los servicios de backend en todos los proxies de API.

Antipatrón

No se recomienda inhabilitar las conexiones persistentes (mantener en vivo) estableciendo la propiedad keepalive.timeout.millis en 0 en la configuración de TargetEndpoint de un proxy de API específico o establecer HTTPTransport.keepalive.timeout.millis en 0 en Message Processors, ya que afectará el rendimiento.

En el siguiente ejemplo, la configuración de TargetEndpoint inhabilita las conexiones persistentes (mantenidas activas) para un servicio de backend específico mediante la configuración de keepalive.timeout.millis en 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>

Si se inhabilitan las conexiones de mantenimiento en vivo para uno o más servicios de backend, Edge debe abrir una conexión nueva por cada solicitud nueva a los servicios de backend de destino. Si el backend es HTTP, Edge también realizará el protocolo de enlace SSL para cada solicitud nueva, lo que se suma a la latencia general de las solicitudes a la API.

Impacto

  • Aumenta el tiempo de respuesta general de las solicitudes a la API, ya que Apigee Edge debe abrir una nueva conexión y realizar el protocolo de enlace SSL para cada solicitud nueva.
  • Es posible que las conexiones se agoten cuando haya condiciones de tráfico alto, ya que lleva tiempo liberar las conexiones de vuelta al sistema.

Práctica recomendada

  • Los servicios de backend deben respetar y manejar la conexión persistente HTTP de acuerdo con los estándares HTTP 1.1.
  • Los servicios de backend deben responder con un encabezado Connection:keep-alive si pueden manejar conexiones persistentes (keep-alive).
  • Los servicios de backend deben responder con un encabezado Connection:close si no pueden controlar conexiones persistentes.

La implementación de este patrón garantizará que Apigee Edge pueda manejar de forma automática una conexión persistente o no persistente con los servicios de backend, sin necesidad de realizar cambios en el proxy de la API.

Lecturas adicionales