Wyświetlasz dokumentację Apigee Edge.
Przejdź do
dokumentacji Apigee X. info
Krótki opis problemu
Aplikacja kliencka otrzymuje kod stanu odpowiedzi HTTP 503 z komunikatem
Service Unavailable po wywołaniu proxy interfejsu API.
Komunikat o błędzie
Aplikacja kliencka otrzymuje ten kod odpowiedzi:
HTTP/1.1 503 Service Unavailable
Dodatkowo możesz zobaczyć 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, które mają zastosowanie w przypadku |
|---|---|---|
| Serwer docelowy przedwcześnie zamyka połączenie | Serwer docelowy przedwcześnie zamyka połączenie, gdy procesor komunikatów nadal wysyła ładunek żądania. | Użytkownicy Edge Public i Private Cloud |
Typowe czynności diagnostyczne
Określanie identyfikatora wiadomości żądania, które się nie powiodło
Narzędzie Trace
Aby określić identyfikator wiadomości żądania, które się nie powiodło, za pomocą narzędzia Trace:
- Jeśli problem nadal występuje, włącz sesję śledzenia dla danego interfejsu API.
- Wywołaj interfejs API i odtwórz problem –
503 Service Unavailablez kodem błędumessaging.adaptors.http.flow.ServiceUnavailable. - Wybierz jedno z żądań, które się nie powiodły.
- Przejdź do fazy AX i określ 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 żądania, które się nie powiodło, za pomocą logów dostępu NGINX:
Aby określić identyfikator wiadomości w przypadku błędów 503, możesz też zapoznać się z logami dostępu NGINX.
Jest to szczególnie przydatne, jeśli problem wystąpił w przeszłości lub występuje sporadycznie
i nie możesz zarejestrować śladu w interfejsie. Aby określić te informacje na podstawie logów dostępu NGINX:
- Sprawdź logi dostępu NGINX (
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log). - Sprawdź, czy w określonym czasie
(jeśli problem wystąpił w przeszłości) lub czy nadal występują błędy
503w przypadku konkretnego proxy interfejsu API503. - Jeśli występują błędy
503z X-Apigee-fault-code messaging.adaptors.http.flow.ServiceUnavailable, zanotuj identyfikator wiadomości co najmniej jednego takiego żądania, jak pokazano w tym przykładzie:Przykładowy wpis pokazujący błąd
503
Przyczyna: serwer docelowy przedwcześnie zamyka połączenie
Diagnostyka
- Jeśli jesteś użytkownikiem Public Cloud lub Private Cloud :
- Użyj narzędzia Trace (jak opis0}opisano w sekcji Typowe czynności diagnostyczne)
i sprawdź, czy w panelu Zarejestrowane dane analityczne masz ustawione te 2 wartości:
- X-Apigee.fault-code:
messaging.adaptors.http.flow.ServiceUnavailable - X-Apigee.fault-source:
target

- X-Apigee.fault-code:
- Użyj narzędzia Trace (jak opisano w sekcji Typowe czynności diagnostyczne) i sprawdź, czy w panelu Błąd bezpośrednio po właściwości
TARGET_REQ_FLOWstate masz ustawione te 2 wartości:- error.class:
com.apigee.errors.http.server.ServiceUnavailableException - error.cause:
Broken pipe

- error.class:
- Aby uzyskać więcej informacji, przeczytaj artykuł Korzystanie z tcpdump.
- Użyj narzędzia Trace (jak opis0}opisano w sekcji Typowe czynności diagnostyczne)
i sprawdź, czy w panelu Zarejestrowane dane analityczne masz ustawione te 2 wartości:
- Jeśli jesteś użytkownikiem Private Cloud :
- Określ identyfikator wiadomości żądania, które się nie powiodło.
- Wyszukaj identyfikator wiadomości w logu procesora komunikatów
(
/opt/apigee/var/log/edge-message-processor/logs/system.log). - Zobaczysz jeden z tych wyjątków:
Wyjątek 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)
lub
Wyjątek 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
- Oba te wyjątki wskazują, że gdy procesor komunikatów nadal zapisywał
ładunek żądania na serwerze backendu, połączenie zostało przedwcześnie zamknięte przez
serwer backendu. Dlatego procesor komunikatów zgłasza wyjątek
java.io.IOException: Broken pipe. - Wartość
Remote:IP:PORTwskazuje rozpoznany adres IP i numer portu serwera backendu. - Atrybut
bytesWritten=76295w powyższym komunikacie o błędzie wskazuje, że procesor komunikatów wysłał do serwera backendu ładunek o rozmiarze76295bajtów, gdy połączenie zostało przedwcześnie zamknięte. - Atrybut
bytesRead=0wskazuje, że procesor komunikatów nie otrzymał żadnych danych (odpowiedzi) z serwera backendu. - Aby dokładniej zbadać ten problem, zbierz
tcpdumpna serwerze backendu lub procesorze komunikatów i przeanalizuj go w sposób opisany poniżej.
Korzystanie z tcpdump
-
Uruchom
tcpdumpna serwerze backendu lub procesorze komunikatów za pomocą tych poleceń:Polecenie do zbierania
tcpdumpna serwerze backendu:tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
Polecenie do zbierania
tcpdumpna procesorze komunikatów:tcpdump -i any -s 0 host BACKEND_HOSTNAME -w FILE_NAME
- Przeanalizuj zebrany
tcpdump:Przykładowe dane wyjściowe tcpdump (zebrane na procesorze komunikatów):

W powyższym
tcpdumpmożesz zobaczyć te informacje:- W pakiecie
4procesor komunikatów wysłał żądaniePOSTdo serwera backendu. - W pakiecie
5,8,9,10,11procesor komunikatów nadal wysyłał ładunek żądania do serwera backendu. - W pakietach
6i7serwer backendu odpowiedziałACKna część ładunku żądania otrzymanego od procesora komunikatów. - Jednak w pakiecie
12serwer backendu zamiast odpowiedziećACKna otrzymane pakiety danych aplikacji i następnie odpowiedzieć ładunkiem odpowiedzi, odpowiadaFIN ACK, inicjując zamknięcie połączenia. - Wyraźnie widać, że serwer backendu przedwcześnie zamyka połączenie gdy procesor komunikatów nadal wysyła ładunek żądania.
- Powoduje to, że procesor komunikatów rejestruje błąd
IOException: Broken Pipei zwraca klientowi kod503.
- W pakiecie
Rozwiązanie
- Współpracuj z zespołem ds. aplikacji lub sieci (albo z oboma zespołami), aby przeanalizować i rozwiązać problem z przedwczesnym rozłączaniem po stronie serwera backendu.
- Upewnij się, że aplikacja serwera backendu nie przekracza limitu czasu ani nie resetuje połączenia przed otrzymaniem całego ładunku żądania.
- Jeśli między Apigee a serwerem backendu znajduje się urządzenie lub warstwa sieci pośredniej, upewnij się, że nie przekraczają one limitu czasu przed otrzymaniem całego ładunku żądania.
Jeśli problem nadal występuje, przejdź do sekcji Informacje diagnostyczne, które musisz zebrać.
Informacje diagnostyczne, które musisz zebrać
Jeśli problem nadal występuje nawet po wykonaniu powyższych instrukcji, zbierz te informacje diagnostyczne i skontaktuj się z zespołem pomocy Apigee Edge:
Jeśli jesteś użytkownikiem Public Cloud, podaj te informacje:
- Nazwa organizacji
- Nazwa środowiska
- Nazwa proxy interfejsu API
- Pełne polecenie
curldo odtworzenia błędu503 - Plik śledzenia zawierający żądanie z błędem
503 Service Unavailable - Jeśli błędy
503nie występują obecnie, podaj okres z informacjami o strefie czasowej, w którym błędy503występowały w przeszłości.
Jeśli jesteś użytkownikiem Private Cloud, podaj te informacje:
- Pełny komunikat o błędzie zaobserwowany w przypadku żądań, które się nie powiodły
- Nazwa organizacji, środowiska i proxy interfejsu API, w przypadku których występują
503błędy - Pakiet proxy interfejsu 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 komunikatów
/opt/apigee/var/log/edge-message-processor/logs/system.log - Okres z informacjami o strefie czasowej, w którym wystąpiły błędy
503 Tcpdumpszebrane na procesorach komunikatów i serwerze backendu, gdy wystąpił błąd