Antimodèle : équilibrer la charge avec un seul serveur cible tout en définissant MaxFailures sur une valeur non nulle

<ph type="x-smartling-placeholder"></ph> Vous consultez la documentation Apigee Edge.
Accédez à la page Documentation sur Apigee X.
En savoir plus

La configuration TargetEndpoint définit la manière dont Apigee Edge se connecte à un d'un service de backend ou d'une API. Il envoie les requêtes et reçoit les réponses vers/depuis le service de backend. Le service de backend peut être un serveur HTTP/HTTPS, NodeJS ou une cible hébergée.

Le service de backend dans le point d'extrémité cible peut être appelé de l'une des manières suivantes :

  • Rediriger une URL vers un serveur HTTP ou HTTPS
  • ScriptTarget vers un script Node.js hébergé en périphérie
  • HostedTarget vers NodeJS déployés dans un environnement cible hébergé
  • Configuration de serveur cible

De même, la règle d'appel de service peut être utilisée pour appeler n'importe quel service externe du flux de proxy d'API. Cette règle permet de définir des URL cibles HTTP/HTTPS directement dans la règle elle-même ou en utilisant une configuration de serveur cible.

Configuration de serveur cible

La configuration de serveur cible dissocie les URL de points de terminaison concrètes des configurations de point d'extrémité cible ou dans les règles d'appel de service. Un serveur cible est référencé par un nom au lieu de l'URL dans le point d'extrémité cible. La configuration de serveur cible comporte le nom d'hôte du service de backend, le numéro de port et d'autres détails.

Voici un exemple de configuration de serveur cible :

<TargetServer name="target1">
  <Host>www.mybackendservice.com</Host>
  <Port>80</Port>
  <IsEnabled>true</IsEnabled>
</TargetServer>

Le serveur cible vous permet d'avoir des configurations différentes pour chaque environnement. Une règle de point d'extrémité cible/d'appel de service peut être configurée avec un ou plusieurs serveur cibles à l'aide d'un équilibreur de charge. La compatibilité intégrée pour l'équilibrage de charge améliore la disponibilité des API et le basculement entre les instances de serveur de backend configurées.

Voici un exemple de configuration de point d'extrémité cible utilisant des serveurs cibles :

<TargetEndpoint name="default">
    <HTTPTargetConnection>>
      <LoadBalancer>
        <Server name="target1"/>
      <Server name="target2"/>
      </LoadBalancer>
    </HTTPTargetConnection>
</TargetEndpoint>

MaxFailures

La configuration MaxFailures spécifie le nombre maximal d'échecs de requêtes vers le serveur cible après lequel le serveur cible est marqué comme étant en panne et supprimé de la rotation pour toutes les requêtes suivantes.

Exemple de configuration avec MaxFailures spécifié :

<TargetEndpoint name="default">
    <HTTPTargetConnection>
      <LoadBalancer>
        <Server name="target1"/>
       <Server name="target2"/>
       <MaxFailures>5</MaxFailures>
      </LoadBalancer>
    </HTTPTargetConnection>
</TargetEndpoint>

Dans l'exemple ci-dessus, si cinq requêtes consécutives échouent pour la cible "target1", la valeur "target1" est supprimée de la rotation et toutes les requêtes suivantes ne sont envoyées qu'à la cible target2.

Antimodèle

Il n'est pas recommandé d'avoir un seul serveur cible dans une configuration LoadBalancer de la règle de point d'extrémité cible ou d'appel de service avec MaxFailures défini sur une valeur non nulle, car cela peut avoir des conséquences négatives.

Prenons l'exemple de configuration suivant ayant un serveur cible unique nommé "target1" avec MaxFailures défini sur 5 (valeur non nulle) :

<TargetEndpoint name="default">
  <HTTPTargetConnection>
      <LoadBalancer>
        <Algorithm>RoundRobin</Algorithm>
        <Server name="target1" />
        <MaxFailures>5</MaxFailures>
      </LoadBalancer>
  </HTTPTargetConnection>

Si les requêtes adressées au serveur cible "target1" échouent cinq fois (nombre spécifié dans MaxFailures), le serveur cible est supprimé de la rotation. Étant donné qu'il n'y a pas d'autre serveurs cibles vers lesquels basculer, toutes les requêtes ultérieures envoyées au proxy d'API ayant cette configuration échouent avec une erreur 503 Service Unavailable.

Même si le serveur cible "target1" revient à son état normal et est capable d'envoyer des réponses réussies, les requêtes adressées au proxy d'API continuent à renvoyer des erreurs 503. Ceci est dû au fait que Edge ne place pas automatiquement le TargetServer même si la cible est à nouveau opérationnelle. Pour résoudre ce problème, le proxy d'API doit être redéployé pour qu'Edge puisse placer le TargetServer est remis en rotation.

Si la même configuration est utilisée dans la règle d'appel de service, les requêtes API affichent une erreur 500 lorsque les requêtes au serveur cible "target1" ont échoué 5 fois.

Impact

L'utilisation d'un seul serveur cible dans une configuration LoadBalancer de la règle de point d'extrémité cible ou d'appel de service avec MaxFailures défini sur une valeur différente de zéro a les effets suivants :

  • Les requêtes API échouent continuellement avec des erreurs 503/500 (lorsque les requêtes échouent le nombre maximal d'échecs) jusqu'à ce que le proxy d'API soit redéployé.
  • Une panne plus longue, car diagnostiquer la cause du problème est compliqué et peut prendre plus de temps (sans connaissance préalable de cet antimodèle).

Bonne pratique

  1. Avoir plusieurs serveurs cibles dans la configuration LoadBalancer pour une meilleure disponibilité.
  2. Définissez toujours un objet HealthMonitor lorsque MaxFailures est défini sur une valeur non nulle. Dès que le nombre d'échecs sur un serveur cible atteint la valeur spécifiée dans MaxFailures, ce serveur est supprimé de la rotation. L'objet HealthMonitor permet de s'assurer que le serveur cible est remis en rotation lorsqu'il est de nouveau disponible. Il n'est donc pas nécessaire de redéployer le proxy.

    Pour s'assurer que la vérification de l'état est effectuée sur le même numéro de port que celui utilisé Edge utilise pour se connecter aux serveurs cibles, Apigee vous recommande d'omettre l'élément enfant <Port> sous <TCPMonitor>, sauf si est différent du port TargetServer. Par défaut, <Port> est identique au port de serveur cible.

    Exemple de configuration avec HealthMonitor :

    <TargetEndpoint name="default">
      <HTTPTargetConnection>
        <LoadBalancer>
          <Algorithm>RoundRobin</Algorithm>
          <Server name="target1" />
          <Server name="target2" />
          <MaxFailures>5</MaxFailures>
        </LoadBalancer>
        <Path>/test</Path>
        <HealthMonitor>
          <IsEnabled>true</IsEnabled>
          <IntervalInSec>5</IntervalInSec>
          <TCPMonitor>
            <ConnectTimeoutInSec>10</ConnectTimeoutInSec>
          </TCPMonitor>
        </HealthMonitor>
      </HTTPTargetConnection>
    </TargetEndpoint>
    
  3. S'il existe une contrainte telle qu'un seul serveur cible et si l'objet HealthMonitor n'est pas utilisé, ne spécifiez pas MaxFailures dans la configuration LoadBalancer.

    La valeur par défaut de MaxFailures est 0. Cela signifie qu'Edge toujours tente de se connecter à la cible pour chaque requête et ne supprime jamais le serveur cible de la rotation.

Documentation complémentaire