503 Dienst nicht verfügbar – Vorzeitiges Schließen durch Back-End-Server

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

Symptom

Nach einem API-Proxy-Aufruf erhält die Clientanwendung den HTTP-Antwortstatus 503 mit der Nachricht Service Unavailable.

Fehlermeldung

Die Clientanwendung erhält den folgenden Antwortcode:

HTTP/1.1 503 Service Unavailable

Außerdem wird möglicherweise die folgende Fehlermeldung angezeigt:

{
   "fault": {
      "faultstring": "The Service is temporarily unavailable",
      "detail": {
           "errorcode": "messaging.adaptors.http.flow.ServiceUnavailable"
       }
    }
}

Mögliche Ursachen

Ursache Beschreibung Anleitungen zur Fehlerbehebung gelten für
Zielserver beendet die Verbindung vorzeitig Der Zielserver beendet die Verbindung vorzeitig, während der Message Processor noch die Nutzlast der Anfrage sendet. Nutzer von Edge Public und Private Cloud

Allgemeine Diagnoseschritte

Nachrichten-ID der fehlgeschlagenen Anfrage ermitteln

Trace-Tool

So ermitteln Sie die Nachrichten-ID der fehlgeschlagenen Anfrage mit dem Trace-Tool:

  1. Wenn das Problem weiterhin besteht, aktivieren Sie die Trace-Sitzung für die betroffene API.
  2. Führen Sie den API-Aufruf aus und reproduzieren Sie das Problem – 503 Service Unavailable mit Fehlercode messaging.adaptors.http.flow.ServiceUnavailable.
  3. Wählen Sie eine der fehlgeschlagenen Anfragen aus.
  4. Gehen Sie zur AX-Phase und ermitteln Sie die Nachrichten-ID (X-Apigee.Message-ID) der Anfrage, indem Sie im Abschnitt Phasendetails nach unten scrollen, wie in der folgenden Abbildung dargestellt.

    Nachrichten-ID im Abschnitt Phasendetails

NGINX-Zugriffslogs

So ermitteln Sie die Nachrichten-ID der fehlgeschlagenen Anfrage mithilfe der NGINX-Zugriffslogs:

Sie können auch in den NGINX-Zugriffslogs die Nachrichten-ID für die 503-Fehler ermitteln. Dies ist besonders nützlich, wenn das Problem in der Vergangenheit aufgetreten ist oder nur zeitweise auftritt und Sie den Trace in der UI nicht erfassen können. Führen Sie die folgenden Schritte aus, um diese Informationen aus den NGINX-Zugriffslogs zu ermitteln:

  1. Prüfen Sie die NGINX-Zugriffslogs: (/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log)
  2. Suchen Sie nach 503-Fehlern für den spezifischen API-Proxy während eines bestimmten Zeitraums (wenn das Problem in der Vergangenheit aufgetreten ist) oder ob Anfragen immer noch mit 503 fehlschlagen.
  3. Wenn 503-Fehler mit X-Apigee-Fehler-Code-Messaging.adaptors.http.flow.ServiceNicht verfügbar auftreten, notieren Sie die Nachrichten-ID für eine oder mehrere solcher Anfragen, wie im folgenden Beispiel gezeigt:

    Beispieleintrag mit dem Fehler 503

    Beispieleintrag mit Statuscode, Nachrichten-ID, Fehlerquelle und Fehlercode

Ursache: Zielserver schließt Verbindung vorzeitig

Diagnose

  1. Wenn Sie die öffentliche Cloud oder die Private Cloud nutzen:
    1. Verwenden Sie das Trace-Tool (wie unter Allgemeine Diagnoseschritte erläutert) und prüfen Sie, ob im Bereich Aufgezeichnete Analytics-Daten beide der folgenden Einstellungen festgelegt sind:
      • X-Apigee.fault-code: messaging.adaptors.http.flow.ServiceUnavailable
      • X-Apigee.fault-source: target

      alt_text

    2. Verwenden Sie das Trace-Tool (wie unter Allgemeine Diagnoseschritte erläutert) und vergewissern Sie sich, dass im Bereich Fehler direkt nach dem Attribut TARGET_REQ_FLOW state die beiden folgenden Einstellungen festgelegt sind:
      • error.class::com.apigee.errors.http.server.ServiceUnavailableException
      • error.cause::Broken pipe

      alt_text

    3. Weitere Informationen finden Sie im Hilfeartikel tcpdump verwenden.
  2. Wenn Sie ein Private Cloud-Nutzer sind:
    • Bestimmen Sie die Nachrichten-ID der fehlgeschlagenen Anfrage.
    • Suchen Sie im Message Processor-Log (/opt/apigee/var/log/edge-message-processor/logs/system.log) nach der Nachrichten-ID.
    • Sie sehen eine der folgenden Ausnahmen:

      Ausnahme 1: java.io.IOException: Broken Pipe beim Schreiben in den Channel ClientOutputChannel aufgetreten

      2021-01-30 15:31:14,693 org:anotherorg env:prod api:myproxy
      rev:1 messageid:myorg-opdk-test-1-30312-13747-1  NIOThread@1
      INFO  HTTP.SERVICE - ExceptionHandler.handleException() :
      Exception java.io.IOException: Broken pipe occurred while writing to channel
      ClientOutputChannel(ClientChannel[Connected:
      Remote:IP:PORT Local:0.0.0.0:42828]@8380 useCount=1
      bytesRead=0 bytesWritten=76295 age=2012ms  lastIO=2ms  isOpen=false)
      

      oder

      Ausnahme 2: onExceptionWrite-Ausnahme: {}
      java.io.IOException: Broken pipe

      2021-01-31 15:29:37,438 org:anotherorg env:prod api:503-test
      rev:1 messageid:leonyoung-opdk-test-1-18604-13978-1
      NIOThread@0 ERROR HTTP.CLIENT - HTTPClient$Context$2.onException() :
      ClientChannel[Connected: Remote:IP:PORT
      Local:0.0.0.0:57880]@8569 useCount=1 bytesRead=0 bytesWritten=76295 age=3180ms  lastIO=2
      ms  isOpen=false.onExceptionWrite exception: {}
      java.io.IOException: Broken pipe
      
    • Beide Ausnahmen zeigen an, dass der Message Processor die Nutzlast der Anfrage noch auf den Back-End-Server schreibt, die Verbindung jedoch vom Back-End-Server vorzeitig beendet wurde. Daher gibt der Message Processor die Ausnahme java.io.IOException: Broken pipe aus.
    • Remote:IP:PORT gibt die aufgelöste IP-Adresse und Portnummer des Back-End-Servers an.
    • Das Attribut bytesWritten=76295 in der obigen Fehlermeldung gibt an, dass der Message Processor eine Nutzlast von 76295 Byte an den Back-End-Server gesendet hat, als die Verbindung vorzeitig beendet wurde.
    • Das Attribut bytesRead=0 gibt an, dass der Message Processor keine Daten (Antwort) vom Back-End-Server erhalten hat.
    • Um dieses Problem genauer zu untersuchen, erfassen Sie ein tcpdump entweder auf dem Back-End-Server oder dem Message Processor und analysieren Sie es wie unten beschrieben.

„tcpdump“ verwenden

  1. Erfassen Sie mit den folgenden Befehlen ein tcpdump auf dem Back-End-Server oder dem Message Processor:

    Befehl zum Erfassen von tcpdump auf dem Back-End-Server:

    tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
    

    Befehl zum Erfassen von tcpdump auf dem Message Processor:

    tcpdump -i any -s 0 host BACKEND_HOSTNAME -w FILE_NAME
    
  2. Analysieren Sie die erfassten tcpdump:

    tcpdump-Beispielausgabe (vom Message Processor erfasst):

    alt_text

    Im obigen tcpdump sehen Sie Folgendes:

    1. Im Paket 4 hat der Message Processor eine POST-Anfrage an den Back-End-Server gesendet.
    2. Im Paket 5, 8, 9, 10, 11 sendete der Message Processor die Anfragenutzlast weiterhin an den Back-End-Server.
    3. Im Paket 6 und 7 hat der Back-End-Server für einen Teil der vom Message Processor empfangenen Anfragenutzlast mit ACK geantwortet.
    4. Im Paket 12 antwortet der Back-End-Server jedoch nicht mit einem ACK für die empfangenen Anwendungsdatenpakete und anschließend mit der Antwortnutzlast, sondern mit einem FIN ACK, um das Schließen der Verbindung zu initiieren.
    5. Dies zeigt deutlich, dass der Back-End-Server die Verbindung vorzeitig schließt, während der Message Processor noch die Nutzlast der Anfrage sendet.
    6. Dies führt dazu, dass der Message Processor einen Fehler IOException: Broken Pipeaufzeichnet und eine 503 an den Client zurückgibt.

Auflösung

  1. Analysieren und beheben Sie das Problem mit den vorzeitigen Verbindungsabbrüchen auf der Back-End-Serverseite mithilfe eines oder beide Ihrer Anwendungs- und Netzwerkteams.
  2. Achten Sie darauf, dass die Back-End-Serveranwendung keine Zeitüberschreitung verursacht oder die Verbindung zurücksetzt, bevor die gesamte Nutzlast der Anfrage empfangen wird.
  3. Wenn Sie ein zwischengeschaltetes Netzwerkgerät oder eine Zwischenschicht zwischen Apigee und dem Back-End-Server haben, achten Sie darauf, dass es zu keiner Zeitüberschreitung kommt, bevor die gesamte Nutzlast der Anfrage empfangen wird.

Wenn das Problem weiterhin besteht, gehen Sie zu Erfassen von Diagnoseinformationen erforderlich.

Erfassen von Diagnoseinformationen erforderlich

Wenn das Problem trotz Befolgen der obigen Anleitung weiterhin besteht, stellen Sie die folgenden Diagnoseinformationen zusammen und wenden Sie sich an den Apigee Edge-Support:

Wenn Sie ein Public Cloud-Nutzer sind, geben Sie die folgenden Informationen an:

  • Name der Organisation
  • Name der Umgebung
  • API-Proxy-Name
  • Führen Sie den Befehl curl aus, um den Fehler 503 zu reproduzieren.
  • Ablaufverfolgungsdatei mit der Anfrage mit dem Fehler 503 Service Unavailable
  • Wenn die 503-Fehler derzeit nicht auftreten, geben Sie den Zeitraum mit den Zeitzoneninformationen an, in denen 503-Fehler in der Vergangenheit aufgetreten sind.

Wenn Sie ein Private Cloud-Nutzer sind, geben Sie die folgenden Informationen an:

  • Vollständige Fehlermeldung bei fehlgeschlagenen Anfragen
  • Organisation, Umgebungsname und API-Proxy-Name, für die Sie 503 Fehler beobachten
  • API-Proxy-Bundle
  • Trace-Datei, die die Anfragen mit dem Fehler 503 Service Unavailable enthält
  • NGINX-Zugriffslogs
    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
  • Message Processor-Protokolle
    /opt/apigee/var/log/edge-message-processor/logs/system.log
  • Der Zeitraum mit den Zeitzoneninformationen, in dem die 503-Fehler aufgetreten sind
  • Tcpdumps, die von den Message Processorn und dem Back-End-Server erfasst wurden, als der Fehler aufgetreten ist