Przeglądasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X. Informacje
Krótki opis problemu
Po wywołaniu serwera proxy interfejsu API aplikacja kliencka otrzymuje stan odpowiedzi HTTP 503
z komunikatem Service Unavailable
.
Komunikat o błędzie
Aplikacja kliencka pobiera ten kod odpowiedzi:
HTTP/1.1 503 Service Unavailable
Oprócz tego może pojawić się ten komunikat o błędzie:
{ "fault": { "faultstring": "The Service is temporarily unavailable", "detail": { "errorcode": "messaging.adaptors.http.flow.ServiceUnavailable" } } }
Możliwe przyczyny
Przyczyna | Opis | Instrukcje rozwiązywania problemów dotyczące |
---|---|---|
Serwer docelowy przedwcześnie zamyka połączenie | Serwer docelowy przedwcześnie kończy połączenie, gdy procesor wiadomości nadal wysyła ładunek żądania. | Użytkownicy chmury publicznej i prywatnej usługi Edge |
Najczęstsze kroki diagnostyki
Określ identyfikator wiadomości nieudanego żądania
Narzędzie do śledzenia
Aby za pomocą narzędzia do śledzenia określić identyfikator wiadomości z nieudanym żądaniem:
- Jeśli problem nadal występuje, włącz sesję śledzenia dla odpowiedniego interfejsu API.
- Wykonaj wywołanie interfejsu API i odtwórz problem –
503 Service Unavailable
z kodem błędumessaging.adaptors.http.flow.ServiceUnavailable.
. - Wybierz jedno z niepomyślnych żądań.
- Przejdź do fazy AX i ustal identyfikator wiadomości (
X-Apigee.Message-ID
) żądania, przewijając w dół sekcję Szczegóły fazy, jak pokazano na ilustracji poniżej.
Logi dostępu NGINX
Aby określić identyfikator wiadomości odrzuconego żądania przy użyciu dzienników dostępu NGINX:
Możesz też sprawdzić identyfikatory wiadomości dla błędów 503
w logach dostępu NGINX.
Jest to szczególnie przydatne, jeśli problem występował w przeszłości lub występuje sporadycznie i nie możesz przechwycić logu czasu w interfejsie użytkownika. Aby określić te informacje w dziennikach dostępu NGINX, wykonaj te czynności:
- Sprawdź logi dostępu do NGINX: (
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
) - Sprawdź, czy występują jakieś
503
błędy związane z konkretnym serwerem proxy interfejsu API w danym okresie (jeśli problem występował w przeszłości) lub czy są jakieś żądania, które nadal kończą się niepowodzeniem z503
. - Jeśli wystąpią błędy
503
z X-Apigee-fault-codeMessaging.adaptors.http.flow.Service zapisz, zanotuj identyfikator wiadomości co najmniej jednego z takich żądań, jak pokazano w poniższym przykładzie:Przykładowy wpis z błędem
503
Przyczyna: serwer docelowy przedwcześnie zamyka połączenie
Diagnostyka
- Jeśli jesteś użytkownikiem chmury publicznej lub chmury prywatnej:
- Użyj narzędzia do śledzenia (jak opisano w sekcji Typowe kroki diagnostyki) i sprawdź, czy w panelu Zarejestrowane dane Analytics masz ustawione oba te warunki:
- X-Apigee.fault-code:
messaging.adaptors.http.flow.ServiceUnavailable
- X-Apigee.fault-source:
target
- X-Apigee.fault-code:
- Użyj narzędzia do śledzenia (jak opisano w sekcji Typowe czynności diagnostyczne) i sprawdź, czy w panelu Błąd bezpośrednio po właściwości state
TARGET_REQ_FLOW
:- error.class:
com.apigee.errors.http.server.ServiceUnavailableException
- error.cause:
Broken pipe
- error.class:
- Aby dowiedzieć się więcej, zapoznaj się z artykułem Korzystanie z tcpdump.
- Użyj narzędzia do śledzenia (jak opisano w sekcji Typowe kroki diagnostyki) i sprawdź, czy w panelu Zarejestrowane dane Analytics masz ustawione oba te warunki:
- Jeśli jesteś użytkownikiem Private Cloud:
- Określ identyfikator wiadomości dla nieudanego żądania.
- Wyszukaj identyfikator wiadomości w logu procesora wiadomości (
/opt/apigee/var/log/edge-message-processor/logs/system.log
). - Występuje jeden z tych wyjątków:
Wyjątek 1: java.io.IOWyjątek: podczas zapisu w kanale ClientExitChannel wystąpił błąd potoku
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)
lub
Wyjątek 2: onexceptWrite wyjątek: {}
java.io.IOWyjątek: Uszkodzona pionowa kreska2021-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
- Oba te wyjątki oznaczają, że gdy procesor wiadomości nadal pisał ładunek żądania do serwera backendu, połączenie zostało przedwcześnie zamknięte przez serwer backendu. Z tego powodu mechanizm przetwarzania wiadomości zgłasza wyjątek
java.io.IOException: Broken pipe
. - Pole
Remote:IP:PORT
wskazuje adres IP i numer portu rozpoznanego serwera backendu. - Atrybut
bytesWritten=76295
w powyższym komunikacie o błędzie wskazuje, że procesor wiadomości wysłał do serwera backendu ładunek w rozmiarze76295
B, gdy połączenie zostało przedwcześnie zamknięte. - Atrybut
bytesRead=0
wskazuje, że procesor wiadomości nie otrzymał żadnych danych (odpowiedzi) z serwera backendu. - Aby dokładniej zbadać ten problem, zbierz obiekt
tcpdump
z serwera backendu lub procesora wiadomości i przeanalizuj go w sposób opisany poniżej.
Korzystanie z tcpdump
-
Przechwyć
tcpdump
na serwerze backendu lub procesorze wiadomości za pomocą tych poleceń:Polecenie pozwalające zebrać
tcpdump
z serwera backendu:tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
Polecenie służące do zebrania adresu
tcpdump
z procesora wiadomości:tcpdump -i any -s 0 host BACKEND_HOSTNAME -w FILE_NAME
- Przeanalizuj zarejestrowane dane (
tcpdump
):Przykładowe dane wyjściowe tcpdump (zebrane w procesie przetwarzania wiadomości):
W powyższym elemencie
tcpdump
możesz zobaczyć:- W pakiecie
4
procesor wiadomości wysłał żądaniePOST
do serwera backendu. - W pakiecie
5
,8
,9
,10
i11
procesor wiadomości nadal wysyłał ładunek żądania do serwera backendu. - W pakietach
6
i7
serwer backendu wysłał odpowiedźACK
na część ładunku żądania otrzymanego od podmiotu przetwarzającego wiadomości. - Jednak w pakiecie
12
zamiastACK
dla odebranych pakietów danych aplikacji, a następnie ładunku odpowiedzi, serwer backendu odpowiadaFIN ACK
, inicjując zamknięcie połączenia. - Wskazuje to wyraźnie, że serwer backendu przedwcześnie zamyka połączenie, gdy procesor wiadomości nadal wysyłał ładunek żądania.
- Powoduje to, że podmiot przetwarzający wiadomości rejestruje błąd
IOException: Broken Pipe
i zwraca klientowi503
.
- W pakiecie
Rozdzielczość
- Skontaktuj się z zespołem ds. aplikacji lub sieci (albo z nim), aby przeanalizować i rozwiązać problem z przedwczesnym rozłączaniem po stronie serwera backendu.
- Zadbaj o to, aby aplikacja serwera backendu nie przekraczała limitu czasu ani nie resetowała połączenia przed odebraniem całego ładunku żądania.
- Jeśli masz pośrednie urządzenie sieciowe lub warstwę między Apigee a serwerem backendu, sprawdź, czy nie przekraczają one limitu czasu, zanim zostanie odebrany cały ładunek żądania.
Jeśli problem nadal występuje, przejdź do artykułu Musisz zebrać informacje diagnostyczne.
Musisz zebrać informacje diagnostyczne
Jeśli problem nie ustąpi mimo wykonania powyższych instrukcji, zbierz poniższe informacje diagnostyczne i skontaktuj się z zespołem pomocy Apigee Edge:
Jeśli jesteś użytkownikiem chmury publicznej, podaj te informacje:
- Nazwa organizacji
- Nazwa środowiska
- Nazwa serwera proxy interfejsu API
- Wykonaj polecenie
curl
, aby odtworzyć błąd503
- Plik śledzenia zawierający żądanie z błędem
503 Service Unavailable
- Jeśli błędy
503
nie występują obecnie, podaj informacje o strefie czasowej, w których wystąpiły błędy503
w przeszłości.
Jeśli jesteś użytkownikiem Private Cloud, podaj te informacje:
- Zaobserwowany pełny komunikat o błędzie dotyczący nieudanych żądań
- Organizacja, nazwa środowiska i nazwa serwera proxy interfejsu API, w przypadku których zaobserwowano
503
błędu - Pakiet proxy API
- Plik śledzenia zawierający żądania z błędem
503 Service Unavailable
- Logi dostępu NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- Logi procesora wiadomości
/opt/apigee/var/log/edge-message-processor/logs/system.log
- Okres z informacjami o strefie czasowej, w których wystąpiły błędy
503
- Dane
Tcpdumps
zebrane z procesorów wiadomości i serwera backendu w momencie wystąpienia błędu