Estás consultando 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 usa para conectarse con servicios de backend. Apigee ofrece varias formas de conectarse a servicios de backend a través de un proxy de API:
- TargetEndpoint para conectarse a cualquier servicio de destino HTTP/HTTPS, NodeJS u hospedado.
- Política ServiceCallout para invocar cualquier servicio externo antes o después de invocar el servidor de destino en TargetEndpoint.
- Código personalizado añadido a la política de JavaScript o a la política JavaCallout para conectarse a servicios de backend.
Conexiones persistentes
Una conexión persistente HTTP, también denominada keep-alive HTTP o reutilización de conexiones HTTP, es un concepto que permite que una sola conexión TCP envíe y reciba varias solicitudes o respuestas HTTP, en lugar de abrir una nueva conexión para cada par de solicitud y 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, se cierra.
El periodo de tiempo de espera de keep-alive se puede configurar mediante una propiedad llamada keepalive.timeout.millis
, que se especifica en la configuración de TargetEndpoint de un proxy de API. Por ejemplo, el periodo de tiempo de keep-alive se puede definir en 30 segundos para un servicio de backend específico en TargetEndpoint.
En el ejemplo siguiente, keepalive.timeout.millis
se ha definido 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 mantener activo de un servicio de backend específico en un proxy de API. También hay una propiedad que controla el comportamiento de mantener activo para todos los servicios backend de todos los proxies. El HTTPTransport.keepalive.timeout.millis
se puede configurar en el componente Message Processor. Esta propiedad también tiene un valor predeterminado de 60 segundos. Si modificas esta propiedad, se verá afectado el comportamiento de la conexión Keep-Alive entre Apigee y todos los servicios de backend de todos los proxies de API.
Antipatrón
No se recomienda inhabilitar las conexiones persistentes (keep-alive) configurando la propiedad keepalive.timeout.millis
en 0 en la configuración de TargetEndpoint de un proxy de API específico o configurando HTTPTransport.keepalive.timeout.millis
en 0 en los procesadores de mensajes, ya que esto afectará al rendimiento.
En el ejemplo siguiente, la configuración de TargetEndpoint inhabilita las conexiones persistentes (keep-alive) de un servicio de backend específico asignando el valor 0 a keepalive.timeout.millis
:
<!-- /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 en uno o varios servicios backend, Apigee debe abrir una nueva conexión para cada nueva solicitud a los servicios backend de destino. Si el backend es HTTPS, Apigee también realizará un handshake SSL para cada nueva solicitud, lo que aumentará la latencia general de las solicitudes de API.
Impacto
- Aumenta el tiempo de respuesta general de las solicitudes de API, ya que Apigee debe abrir una nueva conexión y realizar un handshake SSL para cada nueva solicitud.
- Las conexiones pueden agotarse en condiciones de tráfico elevado, ya que se tarda un tiempo en liberar las conexiones para que vuelvan al sistema.
Práctica recomendada
- Los servicios de backend deben respetar y gestionar las conexiones persistentes HTTP de acuerdo con los estándares de HTTP 1.1.
- Los servicios backend deben responder con un encabezado
Connection:keep-alive
si pueden gestionar conexiones persistentes (keep-alive). - Los servicios backend deben responder con un encabezado
Connection:close
si no pueden gestionar conexiones persistentes.
Si implementas este patrón, Apigee podrá gestionar automáticamente la conexión persistente o no persistente con los servicios de backend sin necesidad de hacer cambios en el proxy de API.