Anti-pattern: disattiva le connessioni HTTP permanenti (keep-alive riutilizzabile)

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

Un proxy API è un'interfaccia per le applicazioni client utilizzata per connettersi ai servizi di backend. Apigee offre diversi modi per connettersi ai servizi di backend tramite un proxy API:

Connessioni permanenti

Connessione permanente HTTP chiamato anche keep-alive HTTP o riutilizzo della connessione HTTP, è un concetto che consente Connessione TCP per inviare e ricevono più richieste/risposte HTTP anziché aprire una nuova connessione per ogni coppia richiesta/risposta.

Apigee utilizza una connessione permanente per la comunicazione con i servizi di backend. La connessione rimane attivo per 60 secondi per impostazione predefinita. Vale a dire, se una connessione è inattiva nel pool di connessioni per per più di 60 secondi, la connessione si chiude.

Il periodo di timeout keep-alive è configurabile tramite una proprietà denominata keepalive.timeout.millis. specificato nella configurazione TargetEndpoint di un proxy API. Ad esempio, keep-alive può essere impostato su 30 secondi per un servizio di backend specifico nel TargetEndpoint.

Nell'esempio seguente, keepalive.timeout.millis è impostato su 30 secondi nel TargetEndpoint configurazione:

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

Nell'esempio precedente, keepalive.timeout.millis controlla il comportamento keep alive per un un servizio di backend specifico in un proxy API. C'è anche una proprietà che controlla il comportamento mantenere attivo per tutti i servizi di backend in tutti i proxy. HTTPTransport.keepalive.timeout.millis configurabili nel componente Processore di messaggi. Questa proprietà ha anche un valore predefinito di 60 secondi. Eventuali modifiche apportate a questa proprietà influiscono sul comportamento della connessione keepalive tra Apigee e tutti i servizi di backend in tutti i proxy API.

Antipattern

Disabilita le connessioni permanenti (keep-alive) impostando la proprietà keepalive.timeout.millis su 0 nella configurazione di TargetEndpoint di un proxy API specifico o impostando Da HTTPTransport.keepalive.timeout.millis a 0 sui processori di messaggi non è consigliato come perché ciò influisce sulle prestazioni.

Nell'esempio seguente, la configurazione di TargetEndpoint disabilita le connessioni permanenti (keep alive) per un servizio di backend specifico impostando keepalive.timeout.millis su 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>

Se le connessioni keep-alive sono disabilitate per uno o più servizi di backend, Apigee deve aprire una una nuova connessione per ogni nuova richiesta ai servizio di backend di destinazione. Se il backend è HTTPS, Apigee eseguirà inoltre l'handshake SSL per ogni nuova richiesta, aggiungendo latenza delle richieste API.

Impatto

  • Aumenta il tempo di risposta complessivo delle richieste API, in quanto Apigee deve aprire una nuova connessione e eseguire l'handshake SSL per ogni nuova richiesta.
  • Le connessioni potrebbero esaurirsi in condizioni di traffico elevato, in quanto occorre un po' di tempo per rilasciare le connessioni al sistema.

Best practice

  • I servizi di backend devono rispettare e gestire la connessione permanente HTTP in conformità con HTTP 1.1 standard.
  • I servizi di backend devono rispondere con un'intestazione Connection:keep-alive, se possibile per gestire le connessioni permanenti (keep-alive).
  • I servizi di backend devono rispondere con un'intestazione Connection:close se non sono in grado di farlo e gestire le connessioni permanenti.

L'implementazione di questo pattern garantirà che Apigee possa gestire automaticamente dati permanenti o non persistenti connessione con i servizi di backend, senza richiedere modifiche al proxy API.

Per approfondire