Antipattern: disattivare le connessioni HTTP permanenti (keep-alive riutilizzabili)

Stai visualizzando la documentazione di Apigee e Apigee hybrid.
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 HTTP permanente, 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/risposte HTTP, instead of opening a new connection for every request/response pair. anziché aprire una nuova connessione per ogni coppia di richiesta/risposta.

Apigee utilizza una connessione permanente per comunicare con i servizi di backend. Per impostazione predefinita, una connessione rimane attiva per 60 secondi. In altre parole, se una connessione è inattiva nel pool di connessioni per più di 60 secondi, la connessione viene chiusa.

Il periodo di timeout keep-alive è configurabile tramite una proprietà denominata keepalive.timeout.millis, specificata nella configurazione di TargetEndpoint di un proxy API. Ad esempio, il periodo di tempo di mantenimento attivo può essere impostato su 30 secondi per un servizio di backend specifico in 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 di keep-alive per tutti i servizi di backend in tutti i proxy. HTTPTransport.keepalive.timeout.millis è configurabile nel componente processore di messaggi. Anche questa proprietà ha un valore predefinito di 60 secondi. Le eventuali modifiche a questa proprietà influiscono sul comportamento della connessione keep-alive tra Apigee e tutti i servizi di backend in tutti i proxy API.

Antipattern

La disattivazione delle connessioni permanenti (keep-alive) impostando la proprietà keepalive.timeout.millis su 0 nella configurazione di TargetEndpoint di un proxy API specifico o impostando HTTPTransport.keepalive.timeout.millis su 0 sui processori di messaggi non è consigliata in quanto influirà sul rendimento.

Nell'esempio seguente, la configurazione di TargetEndpoint disattiva 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 disattivate 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 perché Apigee deve aprire una nuova connessione e eseguire l'handshake SSL per ogni nuova richiesta.
  • Le connessioni potrebbero essere esaurite in condizioni di traffico elevato, poiché è necessario del tempo per rilasciarle nuovamente al sistema.

Best practice

  • I servizi di backend devono rispettare e gestire la connessione persistente 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 la connessione persistente o non persistente con i servizi di backend, senza richiedere modifiche al proxy API.

Per approfondire