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:
- Wenn das Problem weiterhin besteht, aktivieren Sie die Trace-Sitzung für die betroffene API.
- Führen Sie den API-Aufruf aus und reproduzieren Sie das Problem –
503 Service Unavailable
mit Fehlercodemessaging.adaptors.http.flow.ServiceUnavailable.
- Wählen Sie eine der fehlgeschlagenen Anfragen aus.
- 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.
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:
- Prüfen Sie die NGINX-Zugriffslogs: (
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
) - 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 mit503
fehlschlagen. - 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
Ursache: Zielserver schließt Verbindung vorzeitig
Diagnose
- Wenn Sie die öffentliche Cloud oder die Private Cloud nutzen:
- 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
- X-Apigee.fault-code:
- 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
- error.class::
- Weitere Informationen finden Sie im Hilfeartikel tcpdump verwenden.
- 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:
- 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 pipe2021-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 von76295
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
-
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
- Analysieren Sie die erfassten
tcpdump
:tcpdump-Beispielausgabe (vom Message Processor erfasst):
Im obigen
tcpdump
sehen Sie Folgendes:- Im Paket
4
hat der Message Processor einePOST
-Anfrage an den Back-End-Server gesendet. - Im Paket
5
,8
,9
,10
,11
sendete der Message Processor die Anfragenutzlast weiterhin an den Back-End-Server. - Im Paket
6
und7
hat der Back-End-Server für einen Teil der vom Message Processor empfangenen Anfragenutzlast mitACK
geantwortet. - Im Paket
12
antwortet der Back-End-Server jedoch nicht mit einemACK
für die empfangenen Anwendungsdatenpakete und anschließend mit der Antwortnutzlast, sondern mit einemFIN ACK
, um das Schließen der Verbindung zu initiieren. - Dies zeigt deutlich, dass der Back-End-Server die Verbindung vorzeitig schließt, während der Message Processor noch die Nutzlast der Anfrage sendet.
- Dies führt dazu, dass der Message Processor einen Fehler
IOException: Broken Pipe
aufzeichnet und eine503
an den Client zurückgibt.
- Im Paket
Auflösung
- Analysieren und beheben Sie das Problem mit den vorzeitigen Verbindungsabbrüchen auf der Back-End-Serverseite mithilfe eines oder beide Ihrer Anwendungs- und Netzwerkteams.
- 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.
- 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 Fehler503
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 denen503
-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