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

Vous consultez la documentation d'Apigee et d'Apigee hybrid.
Consultez la documentation d'Apigee Edge.

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

Connexions persistantes

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

Apigee 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, la valeur keepalive.timeout.millis est définie sur 30 secondes dans la configuration 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>

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 et l'ensemble des services de backend de tous les proxys d'API.

Antimodèle

Il est déconseillé de désactiver les connexions persistantes (message keep-alive) en définissant la propriété keepalive.timeout.millis sur 0 dans la configuration TargetEndpoint d'un proxy d'API spécifique, ou sur HTTPTransport.keepalive.timeout.millis sur les processeurs de messages, car cela en affectera les performances.

Dans l'exemple ci-dessous, la configuration TargetEndpoint désactive les connexions persistantes (message keep-alive) à 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, Apigee doit ouvrir une nouvelle connexion pour chaque nouvelle requête adressée aux services de backend cibles. Si le backend est HTTPS, Apigee 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 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.

L'application de ce modèle permet de garantir qu'Apigee peut automatiquement gérer une connexion persistante ou non persistante avec les services de backend, sans avoir à modifier le proxy d'API.

Documentation complémentaire