Antimodèle : Désactiver les connexions HTTP persistantes (message keep-alive réutilisable)

Vous consultez la documentation d'Apigee Edge.
Consultez la documentation Apigee X.
en savoir plus

Un proxy d'API est une interface pour les applications clientes permettant de se connecter aux services de backend. Apigee Edge propose plusieurs méthodes de connexion aux services de backend via un proxy d'API:

Connexions persistantes

La connexion HTTP persistante, également appelée "message keep-alive" ou "réutilisation de connexion HTTP", est un concept qui permet à une seule connexion TCP d'envoyer et de recevoir plusieurs requêtes/réponses HTTP, au lieu d'ouvrir une nouvelle connexion pour chaque paire requête/réponse.

Apigee Edge utilise une connexion persistante pour communiquer avec les services de backend. Par défaut, une connexion reste active pendant 60 secondes. En d'autres termes, si une connexion est inactive dans le pool de connexion pendant plus de 60 secondes, la connexion se ferme.

Le délai avant expiration du message keep-alive est configurable via une propriété nommée keepalive.timeout.millis, qui est spécifiée dans la configuration TargetEndpoint d'un proxy d'API. Par exemple, la période du message keep-alive peut être définie sur 30 secondes pour un service de backend spécifique dans TargetEndpoint.

Dans l'exemple ci-dessous, keepalive.timeout.millis est défini sur 30 secondes dans la configuration du point de terminaison cible:

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

Dans l'exemple ci-dessus, keepalive.timeout.millis contrôle le comportement du message keep-alive d'un service de backend spécifique dans un proxy d'API. Il existe également une propriété qui contrôle le comportement du message keep-alive de tous les services de backend dans tous les proxys. La valeur HTTPTransport.keepalive.timeout.millis est configurable dans le composant Message Processor. Cette propriété a également une valeur par défaut de 60 secondes. Toute modification apportée à cette propriété affecte le comportement de connexion du message keep-alive entre Apigee Edge et tous les services de backend de tous les proxys d'API.

Antimodèle

Il n'est pas recommandé de désactiver les connexions persistantes (garder actives) en définissant la propriété keepalive.timeout.millis sur 0 dans la configuration TargetEndpoint d'un proxy d'API spécifique ou en définissant HTTPTransport.keepalive.timeout.millis sur 0 sur les processeurs de messages, car cela aurait un impact sur les performances.

Dans l'exemple ci-dessous, la configuration de TargetEndpoint désactive les connexions persistantes (maintenir actives) pour un service de backend spécifique en définissant keepalive.timeout.millis sur 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 les connexions du message keep-alive sont désactivées pour un ou plusieurs services de backend, Edge doit ouvrir une nouvelle connexion pour chaque nouvelle requête adressée aux services de backend cibles. Si le backend est HTTPS, Edge effectue également un handshake SSL pour chaque nouvelle requête, ajoutant la latence globale des requêtes API.

Impact

  • Accroît le temps de réponse global des requêtes API, car Apigee Edge doit ouvrir une nouvelle connexion et effectuer un handshake SSL pour chaque nouvelle requête.
  • Les connexions peuvent être épuisées en cas de conditions de circulation élevées. En effet, il faut un certain temps pour rétablir les connexions au système.

Bonne pratique

  • Les services de backend doivent respecter et gérer la connexion persistante HTTP conformément aux normes HTTP 1.1.
  • Les services de backend doivent répondre avec un en-tête Connection:keep-alive s'ils sont en mesure de gérer les connexions persistantes (message keep-alive).
  • Les services de backend doivent répondre avec un en-tête Connection:close s'ils ne sont pas en mesure de gérer les connexions persistantes.

La mise en œuvre de ce modèle garantit qu'Apigee Edge peut gérer automatiquement les connexions persistantes ou non persistantes avec les services de backend, sans nécessiter de modifications du proxy d'API.

Complément d'informations