Stai visualizzando la documentazione di Apigee Edge.
Consulta la
documentazione di Apigee X. info
Sintomo
L'applicazione client riceve uno stato della risposta HTTP 503 con il messaggio
Service Unavailable dopo una chiamata al proxy API.
Messaggio di errore
L'applicazione client riceve il seguente codice di risposta:
HTTP/1.1 503 Service Unavailable
Inoltre, potresti visualizzare il seguente messaggio di errore:
{
"fault": {
"faultstring": "The Service is temporarily unavailable",
"detail": {
"errorcode": "messaging.adaptors.http.flow.ServiceUnavailable"
}
}
}Possibili cause
| Causa | Descrizione | Istruzioni per la risoluzione dei problemi applicabili per |
|---|---|---|
| Il server di destinazione chiude prematuramente la connessione | Il server di destinazione termina prematuramente la connessione mentre il processore di messaggi sta ancora inviando il payload della richiesta. | Utenti di Edge Public Cloud e Private Cloud |
Passaggi comuni per la diagnosi
Determinare l'ID messaggio della richiesta non riuscita
Strumento Traccia
Per determinare l'ID messaggio della richiesta non riuscita utilizzando lo strumento Traccia:
- Se il problema è ancora attivo, attiva la sessione di traccia per l'API interessata.
- Effettua la chiamata API e riproduci il problema:
503 Service Unavailablecon il codice di erroremessaging.adaptors.http.flow.ServiceUnavailable. - Seleziona una delle richieste non riuscite.
- Vai alla fase AX e determina l'ID messaggio
(
X-Apigee.Message-ID) della richiesta scorrendo verso il basso nella sezione Dettagli fase, come mostrato nella figura seguente.
Log degli accessi NGINX
Per determinare l'ID messaggio della richiesta non riuscita utilizzando i log degli accessi NGINX:
Puoi anche fare riferimento ai log degli accessi NGINX per determinare l'ID messaggio per gli errori 503.
Questa operazione è particolarmente utile se il problema si è verificato in passato o se è intermittente
e non riesci ad acquisire la traccia nell'interfaccia utente. Segui questi passaggi per determinare queste informazioni dai log degli accessi NGINX:
- Controlla i log degli accessi NGINX: (
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log) - Cerca eventuali errori
503per il proxy API specifico durante un periodo di tempo specifico (se il problema si è verificato in passato) o se sono presenti richieste che non vanno ancora a buon fine con503. - Se sono presenti errori
503con X-Apigee-fault-code messaging.adaptors.http.flow.ServiceUnavailable, annota l'ID messaggio per una o più di queste richieste, come mostrato nell'esempio seguente:Esempio di voce che mostra l'errore
503
Causa: il server di destinazione chiude prematuramente la connessione
Diagnosi
- Se sei un utente di Public Cloud o Private Cloud :
- Utilizza lo strumento Traccia (come spiegato in Passaggi comuni per la diagnosi)
e verifica che nel riquadro Dati di analisi registrati siano impostati entrambi i seguenti valori:
- X-Apigee.fault-code:
messaging.adaptors.http.flow.ServiceUnavailable - X-Apigee.fault-source:
target

- X-Apigee.fault-code:
- Utilizza lo strumento Traccia (come spiegato in Passaggi comuni per la diagnosi)
e verifica che nel riquadro Errore immediatamente dopo
la proprietà
TARGET_REQ_FLOWstate siano impostati entrambi i seguenti valori:- error.class:
com.apigee.errors.http.server.ServiceUnavailableException - error.cause:
Broken pipe

- error.class:
- Vai a Utilizzare tcpdump per ulteriori indagini.
- Utilizza lo strumento Traccia (come spiegato in Passaggi comuni per la diagnosi)
e verifica che nel riquadro Dati di analisi registrati siano impostati entrambi i seguenti valori:
- Se sei un utente di Private Cloud :
- Determina l'ID messaggio della richiesta non riuscita.
- Cerca l'ID messaggio nel log del processore di messaggi
(
/opt/apigee/var/log/edge-message-processor/logs/system.log). - Verrà visualizzata una delle seguenti eccezioni:
Eccezione n. 1: java.io.IOException: Broken pipe occurred while writing to channel ClientOutputChannel
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)
o
Eccezione n. 2: onExceptionWrite exception: {}
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
- Entrambe queste eccezioni indicano che, mentre il processore di messaggi stava ancora scrivendo il
payload della richiesta nel server di backend, la connessione è stata chiusa prematuramente dal
server di backend. Di conseguenza, il processore di messaggi genera l'eccezione
java.io.IOException: Broken pipe. - Il
Remote:IP:PORTindica l'indirizzo IP e il numero di porta del server di backend risolto. - L'attributo
bytesWritten=76295nel messaggio di errore riportato sopra indica che il processore di messaggi aveva inviato un payload di76295byte al server di backend quando la connessione è stata chiusa prematuramente. - L'attributo
bytesRead=0indica che il processore di messaggi non ha ricevuto dati (risposta) dal server di backend. - Per esaminare ulteriormente questo problema, raccogli un
tcpdumpsul server di backend o sul processore di messaggi e analizzalo come spiegato di seguito.
Utilizzare tcpdump
-
Acquisisci un
tcpdumpsul server di backend o sul processore di messaggi con i seguenti comandi:Comando per raccogliere
tcpdumpsul server di backend:tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
Comando per raccogliere
tcpdumpsul processore di messaggi:tcpdump -i any -s 0 host BACKEND_HOSTNAME -w FILE_NAME
- Analizza il
tcpdumpacquisito:Esempio di output di tcpdump (raccolto sul processore di messaggi):

Nel
tcpdumpriportato sopra, puoi vedere quanto segue:- Nel pacchetto
4, il processore di messaggi ha inviato una richiestaPOSTa il server di backend. - Nei pacchetti
5,8,9,10,11, il processore di messaggi ha continuato a inviare il payload della richiesta al server di backend. - Nei pacchetti
6e7,il server di backend ha risposto conACKper una parte del payload della richiesta ricevuta dal processore di messaggi. - Tuttavia, nel pacchetto
12, anziché rispondere con unACKper i pacchetti di dati dell'applicazione ricevuti e successivamente con il payload della risposta, il server di backend risponde invece con unFIN ACKche avvia la chiusura della connessione. - Questo dimostra chiaramente che il server di backend chiude prematuramente la connessione mentre il processore di messaggi stava ancora inviando il payload della richiesta.
- In questo modo, il processore di messaggi registra un
IOException: Broken Pipeerrore e restituisce un503al client
- Nel pacchetto
Risoluzione
- Collabora con i team di applicazioni e di rete per analizzare e risolvere il problema delle disconnessioni premature sul lato del server di backend.
- Assicurati che l'applicazione del server di backend non vada in timeout o non reimposti la connessione prima di ricevere l'intero payload della richiesta.
- Se hai un dispositivo o un livello di rete intermedio tra Apigee e il server di backend, assicurati che non vada in timeout prima che venga ricevuto l'intero payload della richiesta.
Se il problema persiste, vai a Informazioni di diagnostica da raccogliere.
Informazioni di diagnostica da raccogliere
Se il problema persiste anche dopo aver seguito le istruzioni riportate sopra, raccogli le seguenti informazioni di diagnostica e contatta l'assistenza Apigee Edge:
Se sei un utente di Public Cloud, fornisci le seguenti informazioni:
- Nome dell'organizzazione
- Nome ambiente
- Nome del proxy API
- Comando
curlcompleto per riprodurre l'errore503 - File di traccia contenente la richiesta con l'errore
503 Service Unavailable - Se gli errori
503non si verificano al momento, fornisci il periodo di tempo con le informazioni sul fuso orario in cui si sono verificati in passato.503
Se sei un utente di Private Cloud, fornisci le seguenti informazioni:
- Messaggio di errore completo osservato per le richieste non riuscite
- Nome dell'organizzazione, dell'ambiente e del proxy API per cui stai osservando
503errori - Bundle del proxy API
- File di traccia contenente le richieste con l'errore
503 Service Unavailable - Log degli accessi NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log - Log del processore di messaggi
/opt/apigee/var/log/edge-message-processor/logs/system.log - Il periodo di tempo con le informazioni sul fuso orario in cui si sono verificati gli errori
503 Tcpdumpsraccolti sui processori di messaggi e sul server di backend quando si è verificato l'errore