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

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

Un proxy de API es una interfaz para aplicaciones cliente que se usa para conectarse con los servicios de backend. Apigee ofrece 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. De forma predeterminada, una conexión permanece activa durante 60 segundos. Es decir, si una conexión está inactiva en el grupo de conexiones durante más de 60 segundos, se cierra la conexión.

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 continuo de un servicio de backend específico en un proxy de API. También hay una propiedad que controla el comportamiento activo para todos los servicios de backend en todos los proxies. El elemento HTTPTransport.keepalive.timeout.millis se puede configurar en el componente Procesador de mensajes. Esta propiedad también tiene un valor predeterminado de 60 segundos. La modificación de esta propiedad afecta el comportamiento de conexión en curso 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 un protocolo de enlace SSL para cada solicitud nueva.
  • Las conexiones pueden agotarse en condiciones de tráfico altas, ya que lleva un tiempo actualizar las conexiones 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 las conexiones persistentes.

Implementar este patrón garantizará que Apigee pueda manejar automáticamente la conexión persistente o no persistente con los servicios de backend, sin requerir cambios en el proxy de API.

Lecturas adicionales