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

Estás viendo la documentación de Apigee y Apigee Hybrid.
Consulta la documentación de Apigee Edge.

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

Conexiones persistentes

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

Apigee 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. Realizar modificaciones en esta propiedad afecta el comportamiento de conexión de keep-alive entre Apigee y todos los servicios de backend en todos los proxies de API.

Antipatrón

Inhabilitar las conexiones persistentes (keep-alive) mediante el establecimiento de la propiedad keepalive.timeout.millis en 0 en la configuración de TargetEndpoint de un proxy de API específico o configurar HTTPTransport.keepalive.timeout.millis en 0 en procesadores de mensajes, no se recomienda, ya que tendría un impacto en el rendimiento.

En el siguiente ejemplo, la configuración de TargetEndpoint inhabilita las conexiones persistentes (keep-alive) para un servicio de backend específico si se establece 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 las conexiones keep-alive están inhabilitadas para uno o más servicios de backend, Apigee debe abrir una conexión nueva para cada solicitud nueva en los servicios de backend de destino. Si el backend es HTTPs, Apigee también realizará un protocolo de enlace SSL para cada solicitud nueva, lo que se agrega 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 debe abrir una conexión nueva 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 pueda controlar automáticamente la conexión persistente o no persistente con los servicios de backend, sin necesitar cambios en el proxy de API.

Lecturas adicionales