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

Stai visualizzando la documentazione relativa a Apigee e Apigee ibrido.
Visualizza la 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

La connessione permanente HTTP, chiamata anche keep-alive HTTP o riutilizzo della connessione HTTP, è un concetto che consente a una singola connessione TCP di inviare e ricevere più richieste HTTP/risposte, invece di aprire una nuova connessione per ogni coppia di richiesta/risposta.

Apigee utilizza una connessione permanente per la comunicazione con i servizi di backend. Per impostazione predefinita, una connessione rimane attiva per 60 secondi. Ciò significa che se una connessione è inattiva nel pool di connessioni per più di 60 secondi, viene chiusa.

Il periodo di timeout keepalive è configurabile tramite una proprietà denominata keepalive.timeout.millis, specificata nella configurazione di TargetEndpoint di un proxy API. Ad esempio, il periodo di tempo 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 nella configurazione di 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>

Nell'esempio precedente, keepalive.timeout.millis controlla il comportamento keep-alive per un servizio di backend specifico in un proxy API. Esiste anche una proprietà che controlla il comportamento permanente per tutti i servizi di backend in tutti i proxy. HTTPTransport.keepalive.timeout.millis è configurabile nel componente Processore di messaggi. Questa proprietà ha anche un valore predefinito di 60 secondi. Le 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

La disabilitazione delle connessioni permanenti (keep-alive) impostando la proprietà keepalive.timeout.millis su 0 nella configurazione TargetEndpoint di un proxy API specifico o impostando HTTPTransport.keepalive.timeout.millis su 0 sui processori di messaggi non è consigliata perché potrebbe influire 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 nuova connessione per ogni nuova richiesta ai servizio di backend di destinazione. Se il backend è HTTPS, Apigee eseguirà anche l'handshake SSL per ogni nuova richiesta, aumentando la latenza complessiva delle richieste API.

Impatto

  • Aumenta il tempo di risposta complessivo delle richieste API, poiché Apigee deve aprire una nuova connessione ed eseguire l'handshake SSL per ogni nuova richiesta.
  • Le connessioni possono 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 gli standard HTTP 1.1.
  • I servizi di backend devono rispondere con un'intestazione Connection:keep-alive se sono in grado di gestire le connessioni permanenti (keep-alive).
  • I servizi di backend devono rispondere con un'intestazione Connection:close se non sono in grado di gestire le connessioni permanenti.

L'implementazione di questo pattern garantisce che Apigee possa gestire automaticamente le connessioni permanenti o non persistenti con i servizi di backend, senza richiedere modifiche al proxy API.

Per approfondire