Anti-Pattern: Nichtflüchtige HTTP-Verbindungen (wiederverwendbare Keep-Alive-Verbindungen) deaktivieren

Sie lesen gerade die Dokumentation zu Apigee und Apigee Hybrid.
Apigee Edge-Dokumentation aufrufen.

Ein API-Proxy ist eine Schnittstelle für Client-Anwendungen, die für die Verbindung mit Backend-Diensten verwendet wird. Apigee bietet mehrere Möglichkeiten, eine Verbindung zu Backend-Diensten über einen API-Proxy herzustellen:

Persistente Verbindungen

Das Konzept der vollständigen HTTP-Verbindung, auch HTTP-Keep-Alive- oder Wiederverwendung der HTTP-Verbindung genannt, ermöglicht einer einzelnen TCP das Senden und Empfangen mehrerer HTTP-Anfragen/-Antworten, anstatt eine neue Verbindung für jedes Anfrage-/Antwort-Paar herzustellen.

Apigee verwendet für die Kommunikation mit Back-End-Diensten eine nichtflüchtige Verbindung. Eine Verbindung bleibt standardmäßig 60 Sekunden aktiv. Wenn also eine Verbindung länger als 60 Sekunden inaktiv ist, wird die Verbindung geschlossen.

Das Zeitlimit für KeepAlive kann über ein Attribut namens keepalive.timeout.millis konfiguriert werden, das in der TargetEndpoint-Konfiguration eines API-Proxys angegeben ist. Der Keep-Alive-Zeitraum kann für einen bestimmten Back-End-Dienst im TargetEndpoint beispielsweiseauf 30 Sekunden festgelegt werden.

Im folgenden Beispiel wird keepalive.timeout.millis in der TargetEndpoint-Konfiguration auf 30 Sekunden festgelegt:

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

Im obigen Beispiel steuert keepalive.timeout.millis das Keep-Alive-Verhalten für einen bestimmten Backend-Dienst in einem API-Proxy. Es gibt auch ein Attribut, das das Keep-Alive-Verhalten für alle Backend-Dienste in allen Proxys steuert. HTTPTransport.keepalive.timeout.millis kann in der Message Processor-Komponente konfiguriert werden. Dieses Attribut hat auch einen Standardwert von 60 Sekunden. Änderungen an diesem Attribut wirken sich auf das Keep-Alive-Verhalten der Verbindung zwischen Apigee und allen Backend-Diensten in allen API-Proxys aus.

Anti-Pattern

Das Deaktivieren von nichtflüchtigen (Keep-Alive-)Verbindungen, indem Sie das Attribut keepalive.timeout.millis in der TargetEndpoint-Konfiguration eines bestimmten API-Proxys auf 0 oder in Message Processors HTTPTransport.keepalive.timeout.millis auf 0 setzen, wird nicht empfohlen, da dies die Leistung beeinträchtigt.

Im folgenden Beispiel deaktiviert die TargetEndpoint-Konfiguration nichtflüchtige (Keep-Alive-)Verbindungen für einen bestimmten Backend-Dienst durch Festlegung von keepalive.timeout.millis auf 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>

Wenn Keep-Alive-Verbindungen für einen oder mehrere Backend-Dienste deaktiviert sind, muss Apigee für jede neue Anfrage an die Ziel-Backend-Dienste eine neue Verbindung herstellen. Wenn das Backend HTTPS ist, führt Apigee für jede neue Anfrage einen SSL-Handshake aus, was die Gesamtlatenz von API-Anfragen erhöht.

Auswirkungen

  • Erhöht die Gesamtantwortzeit von API-Anfragen, da Apigee eine neue Verbindung öffnen und für jede neue Anfrage einen SSL-Handshake ausführen muss.
  • Verbindungen können bei starkem Traffic ausgeschöpft werden, da es einige Zeit dauert, bis Verbindungen wieder im System freigegeben werden.

Best Practice

  • Backend-Dienste müssen die HTTP-Verbindung gemäß den HTTP 1.1-Standards anerkennen und verarbeiten.
  • Backend-Dienste sollten mit einem Connection:keep-alive-Header antworten, wenn dieser in der Lage ist, nichtflüchtige (Keep-Alive-)Verbindungen zu verarbeiten.
  • Backend-Dienste sollten mit einem Connection:close-Header antworten, wenn dieser nicht in der Lage ist, nichtflüchtige Verbindungen zu verarbeiten.

Durch die Implementierung dieses Musters kann Apigee sicherstellen, dass dauerhafte oder nicht dauerhafte Verbindungen mit Back-End-Diensten automatisch verarbeitet werden können, ohne Änderungen am API-Proxy vorzunehmen.

Weitere Informationen