Antipattern: bilanciamento del carico con un singolo server di destinazione con MaxFailures impostato su un valore diverso da zero

Stai visualizzando la documentazione relativa a Apigee e Apigee ibrido.
Visualizza la documentazione di Apigee Edge.

La configurazione di TargetEndpoint definisce il modo in cui Apigee si connette a un di servizio di backend o API. Invia le richieste e riceve le risposte da/verso il servizio di backend. Il servizio di backend può essere un server HTTP/HTTPS o NodeJS.

Il servizio di backend in TargetEndpoint può essere richiamato in uno dei seguenti modi:

  • URL diretto a un server HTTP o HTTPS
  • Configurazione di TargetServer

Allo stesso modo, le norme ServiceCallout possono essere utilizzate per effettuare una chiamata a qualsiasi servizio esterno dal flusso del proxy API. Questo criterio supporta la definizione di URL di destinazione HTTP/HTTPS direttamente nel criterio stesso o tramite una configurazione TargetServer.

Configurazione di TargetServer

La configurazione di TargetServer disaccoppia gli URL concreti dell'endpoint Configurazioni TargetEndpoint o nei criteri relativi ai callout di servizio. Un TargetServer viene richiamato tramite un nome anziché tramite l'URL in TargetEndpoint. La configurazione di TargetServer avrà il nome host del servizio di backend, il numero di porta e altri dettagli.

Ecco un esempio di configurazione di TargetServer:

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

TargetServer consente di avere diverse configurazioni per ogni ambiente. Un criterio TargetEndpoint/Callout di servizio può essere configurato con uno o più TargetServer denominati utilizzando un bilanciatore del carico. Il supporto integrato per il bilanciamento del carico migliora la disponibilità delle API e il failover tra le istanze del server di backend configurate.

Ecco un esempio di configurazione di TargetEndpoint che utilizza TargetServers:

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

MaxFailures

La configurazione MaxFailures specifica il numero massimo di errori delle richieste al server di destinazione, dopodiché quest'ultimo verrà contrassegnato come inattivo e rimosso dalla rotazione per tutte le richieste successive.

Una configurazione di esempio con MaxFailures specificato:

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

Nell'esempio precedente, se cinque richieste consecutive per "target1" non sono andate a buon fine poi "target1" verrà rimossa dalla rotazione e tutte le richieste successive saranno inviate solo a target2.

Antipattern

Non è consigliabile avere un singolo TargetServer in una configurazione LoadBalancer del criterio TargetEndpoint o Service Callout con MaxFailures impostato su un valore diverso da zero, in quanto può avere implicazioni negative.

Prendi in considerazione la seguente configurazione di esempio con un singolo TargetServer chiamato "target1" con MaxFailures impostato su 5 (valore diverso da zero):

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

Se le richieste a TargetServer "target1" non riesce cinque volte (numero specificato in MaxFailures), il TargetServer viene rimosso dalla rotazione. Poiché non esistono altri TargetServer a cui eseguire il failover, tutte le successive richieste al proxy API con questa configurazione non andranno a buon fine 503 Service Unavailable errore.

Anche se TargetServer "target1" torna al suo stato normale ed è in grado di inviare risposte positive, le richieste al proxy API continueranno restituiscono errori 503. Questo perché Apigee non inserisce automaticamente TargetServer in rotazione anche dopo che il target è di nuovo attivo e funzionante. Per risolvere il problema, è necessario eseguire nuovamente il deployment del proxy API affinché Apigee possa applicare TargetServer torna alla rotazione.

Se viene utilizzata la stessa configurazione nel criterio di callout del servizio, le richieste API riceveranno l'errore 500 dopo che le richieste al server di destinazione "target1" non andranno a buon fine per 5 volte.

Impatto

L'utilizzo di un singolo TargetServer in una configurazione di LoadBalancer del criterio TargetEndpoint o Callout di servizio con MaxFailures impostato su un valore diverso da zero comporta:

  • Le richieste API non devono riuscire con errori 503/500 in modo continuo (dopo che le richieste non sono riuscite per il numero di volte specificato in MaxFailures) finché il proxy API non viene reimplementato.
  • Interruzione più lunga perché è complicata e può richiedere più tempo per diagnosticare la causa del problema (senza conoscenza pregressa di questo antipattern).

Best practice

  1. Avere più di un TargetServer nella configurazione LoadBalancer per una maggiore disponibilità.
  2. Definisci sempre un monitoraggio dell'integrità quando MaxFailures è impostato su un valore diverso da zero. Un server di destinazione viene rimosso dalla rotazione quando il numero di errori raggiunge il numero specificato in MaxFailures. Avere un HealthMonitor assicura che TargetServer venga rimesso in rotazione non appena il server di destinazione diventa nuovamente disponibile, ossia ci sono non è necessario eseguire nuovamente il deployment del proxy.

    Per assicurare che il controllo di integrità venga eseguito sullo stesso numero di porta Apigee utilizza per connettersi ai server di destinazione, pertanto consiglia di omettere l'elemento secondario <Port> in <TCPMonitor>, a meno che è diversa dalla porta TargetServer. Per impostazione predefinita, <Port> corrisponde alla porta TargetServer.

    Esempio di configurazione con 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. Se esiste un vincolo che prevede un solo TargetServer e se HealthMonitor non viene utilizzato, non specificare MaxFailures nella configurazione di LoadBalancer.

    Il valore predefinito di MaxFailures è 0. Ciò significa che Apigee tenta sempre di connettersi al target per ogni richiesta e non rimuove mai il server target dalla rotazione.

Per approfondire