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

Estás viendo la documentación de Apigee Edge.
Ve a 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 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 Edge usa conexiones persistentes 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 cualquier modificación a esta propiedad afecta el comportamiento de la conexión keep alive entre Apigee Edge 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 de mantenimiento activas están inhabilitadas para uno o más servicios de backend, Edge debe abrir una una conexión nueva para cada solicitud nueva a los servicios de backend de destino. Si el backend es HTTPS, Edge también realizará el protocolo de enlace SSL para cada solicitud nueva la latencia 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.

Implementar este patrón garantizará que Apigee Edge controle automáticamente los procesos persistentes con servicios de backend sin la necesidad de hacer cambios en el proxy de API.

Lecturas adicionales