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

Sie sehen die Dokumentation zu Apigee Edge.
Zur Apigee X-Dokumentation
weitere Informationen

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

Persistente Verbindungen

Persistente HTTP-Verbindung, auch HTTP-Keep-Alive oder Wiederverwendung von HTTP-Verbindungen genannt, ist ein Konzept, das es einer einzelnen TCP-Verbindung ermöglicht, mehrere HTTP-Anfragen/-Antworten/-Antworten zu senden und zu empfangen, anstatt für jedes Anfrage/Antwort-Paar eine neue Verbindung herzustellen.

Apigee Edge verwendet eine persistente Verbindung für die Kommunikation mit Back-End-Diensten. 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 beispielsweise für einen bestimmten Back-End-Dienst in TargetEndpoint auf 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 Back-End-Dienst in einem API-Proxy. Es gibt auch ein Attribut, das das Live-Verhalten für alle Back-End-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 Verbindungsverhalten zwischen Apigee Edge und allen Back-End-Diensten in allen API-Proxys aus.

Anti-Pattern

Persistente (Keep-Alive-)Verbindungen sollten nicht deaktiviert werden. Dazu setzen Sie das Attribut keepalive.timeout.millis in der TargetEndpoint-Konfiguration eines bestimmten API-Proxys auf 0 oder HTTPTransport.keepalive.timeout.millis auf Message Processorn auf 0, da dies die Leistung beeinträchtigt.

Im folgenden Beispiel deaktiviert die TargetEndpoint-Konfiguration persistente (Keep-Alive-)Verbindungen für einen bestimmten Back-End-Dienst, indem keepalive.timeout.millis auf 0 gesetzt wird:

<!-- /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 Back-End-Dienste deaktiviert sind, muss Edge für jede neue Anfrage an die Ziel-Back-End-Dienste eine neue Verbindung öffnen. Wenn das Back-End HTTPS ist, führt Edge auch einen SSL-Handshake für jede neue Anfrage aus, was zur Gesamtlatenz von API-Anfragen beiträgt.

Auswirkungen

  • Erhöht die Gesamtantwortzeit von API-Anfragen, da Apigee Edge 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

  • Back-End-Dienste sollten nichtflüchtige HTTP-Verbindungen in Übereinstimmung mit HTTP 1.1-Standards berücksichtigen und verarbeiten.
  • Back-End-Dienste sollten mit einem Connection:keep-alive-Header antworten, wenn sie dauerhafte Verbindungen (Keep-Alive) verarbeiten können.
  • Back-End-Dienste sollten mit einem Connection:close-Header antworten, wenn sie keine dauerhaften Verbindungen verarbeiten können.

Durch die Implementierung dieses Musters wird sichergestellt, dass Apigee Edge automatisch eine persistente oder nicht persistente Verbindung mit Back-End-Diensten verarbeiten kann, ohne Änderungen am API-Proxy erforderlich zu machen.

Weitere Informationen