503 Servizio non disponibile - Chiusura prematura da parte del server di backend

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:

  1. Se il problema è ancora attivo, attiva la sessione di traccia per l'API interessata.
  2. Effettua la chiamata API e riproduci il problema: 503 Service Unavailable con il codice di errore messaging.adaptors.http.flow.ServiceUnavailable.
  3. Seleziona una delle richieste non riuscite.
  4. 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.

    ID messaggio nella sezione Dettagli fase

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:

  1. Controlla i log degli accessi NGINX: (/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log)
  2. Cerca eventuali errori 503 per 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 con 503.
  3. Se sono presenti errori 503 con 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

    Voce di esempio che mostra il codice di stato, l'ID messaggio, l'origine dell'errore e il codice di errore

Causa: il server di destinazione chiude prematuramente la connessione

Diagnosi

  1. Se sei un utente di Public Cloud o Private Cloud :
    1. 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

      alt_text

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

      alt_text

    3. Vai a Utilizzare tcpdump per ulteriori indagini.
  2. 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 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
    • 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:PORT indica l'indirizzo IP e il numero di porta del server di backend risolto.
    • L'attributo bytesWritten=76295 nel messaggio di errore riportato sopra indica che il processore di messaggi aveva inviato un payload di 76295 byte al server di backend quando la connessione è stata chiusa prematuramente.
    • L'attributo bytesRead=0 indica che il processore di messaggi non ha ricevuto dati (risposta) dal server di backend.
    • Per esaminare ulteriormente questo problema, raccogli un tcpdump sul server di backend o sul processore di messaggi e analizzalo come spiegato di seguito.

Utilizzare tcpdump

  1. Acquisisci un tcpdump sul server di backend o sul processore di messaggi con i seguenti comandi:

    Comando per raccogliere tcpdump sul server di backend:

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

    Comando per raccogliere tcpdump sul processore di messaggi:

    tcpdump -i any -s 0 host BACKEND_HOSTNAME -w FILE_NAME
    
  2. Analizza il tcpdump acquisito:

    Esempio di output di tcpdump (raccolto sul processore di messaggi):

    alt_text

    Nel tcpdump riportato sopra, puoi vedere quanto segue:

    1. Nel pacchetto 4, il processore di messaggi ha inviato una richiesta POST a il server di backend.
    2. Nei pacchetti 5, 8, 9, 10, 11, il processore di messaggi ha continuato a inviare il payload della richiesta al server di backend.
    3. Nei pacchetti 6 e 7,il server di backend ha risposto con ACK per una parte del payload della richiesta ricevuta dal processore di messaggi.
    4. Tuttavia, nel pacchetto 12, anziché rispondere con un ACK per i pacchetti di dati dell'applicazione ricevuti e successivamente con il payload della risposta, il server di backend risponde invece con un FIN ACK che avvia la chiusura della connessione.
    5. Questo dimostra chiaramente che il server di backend chiude prematuramente la connessione mentre il processore di messaggi stava ancora inviando il payload della richiesta.
    6. In questo modo, il processore di messaggi registra un IOException: Broken Pipe errore e restituisce un 503 al client

Risoluzione

  1. Collabora con i team di applicazioni e di rete per analizzare e risolvere il problema delle disconnessioni premature sul lato del server di backend.
  2. 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.
  3. 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 curl completo per riprodurre l'errore 503
  • File di traccia contenente la richiesta con l'errore 503 Service Unavailable
  • Se gli errori 503 non 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 503 errori
  • 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
  • Tcpdumps raccolti sui processori di messaggi e sul server di backend quando si è verificato l'errore