Przeglądasz dokumentację Apigee Edge.
Przejdź do
Dokumentacja Apigee X. informacje.
Krótki opis problemu
Aplikacja kliencka otrzymuje stan odpowiedzi HTTP 503 z komunikatem
Service Unavailable po wywołaniu serwera proxy interfejsu API.
Komunikat o błędzie
Aplikacja kliencka otrzymuje ten kod odpowiedzi:
HTTP/1.1 503 Service Unavailable
Możesz też zobaczyć następujący 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 pozostaje w bezruchu wysyłając ładunek żądania. | Użytkownicy chmury publicznej i prywatnej Edge |
Typowe kroki diagnostyki
Określ identyfikator wiadomości nieudanego żądania
Narzędzie śledzenia
Aby za pomocą narzędzia śledzenia określić identyfikator wiadomości nieudanego żądania:
- Jeśli problem jest nadal aktywny, włącz śledzenia sesji dla interfejsu API, którego dotyczy problem.
- Wykonaj wywołanie interfejsu API i odtwórz problem –
503 Service Unavailablez kodem błędumessaging.adaptors.http.flow.ServiceUnavailable. - Wybierz jedno z nieudanych żądań.
- Przejdź do fazy AX i określ identyfikator wiadomości.
(
X-Apigee.Message-ID) żądania, przewijając w dół Szczegóły fazy, jak pokazano na ilustracji poniżej.
Logi dostępu NGINX
Aby określić identyfikator wiadomości nieudanego żądania przy użyciu logów dostępu NGINX:
Identyfikator komunikatu błędów 503 możesz też sprawdzić w logach dostępu NGINX.
Jest to szczególnie przydatne, jeśli problem wystąpił w przeszłości lub jest przejściowy
i nie można przechwycić logu czasu w interfejsie. Aby określić te informacje z logów dostępu NGINX, wykonaj te czynności:
- Sprawdź logi dostępu NGINX: (
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log) - Wyszukaj błędy
503dla określonego serwera proxy interfejsu API w określonym czasie (jeśli problem wystąpił w przeszłości) lub masz jakieś żądania, które nadal kończą się niepowodzeniem (503). - Jeśli występują błędy
503z kodem X-Apigee-fault-code messages.adaptors.http.flow.ServiceUnavailable, zanotuj identyfikator jednej lub kilku takich żądań, jak w tym przykładzie:Przykładowy wpis z błędem
503
Przyczyna: serwer docelowy przedwcześnie zamyka połączenie
Diagnostyka
- Jeśli jesteś użytkownikiem Public Cloud lub Private Cloud:
- Użyć narzędzia śledzenia (jak opisano w sekcji Typowe kroki diagnostyki).
i sprawdź, czy w panelu Analytics Data Recorded (Rejestrowane dane Analytics) masz ustawione oba te elementy:
- X-Apigee.fault-code:
messaging.adaptors.http.flow.ServiceUnavailable - X-Apigee.fault-source:
target

- X-Apigee.fault-code:
- Użyć narzędzia śledzenia (jak opisano w sekcji Typowe kroki diagnostyki).
i sprawdź, czy w panelu Error (Błąd) masz ustawione oba te ustawienia bezpośrednio po
właściwość state
TARGET_REQ_FLOW:- error.class::
com.apigee.errors.http.server.ServiceUnavailableException - error.cause:
Broken pipe

- error.class::
- Więcej informacji znajdziesz w artykule Korzystanie z tcpdump.
- Użyć narzędzia śledzenia (jak opisano w sekcji Typowe kroki diagnostyki).
i sprawdź, czy w panelu Analytics Data Recorded (Rejestrowane dane Analytics) masz ustawione oba te elementy:
- Jeśli jesteś użytkownikiem Private Cloud:
- Ustal identyfikator wiadomości nieudanego żądania.
- Wyszukaj identyfikator wiadomości w dzienniku procesora wiadomości
(
/opt/apigee/var/log/edge-message-processor/logs/system.log). - Zobaczysz jeden z tych wyjątków:
Wyjątek 1: java.io.IOException: podczas zapisu do kanału ClientOutputChannel wystąpiła uszkodzona potok
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: wyjątek onExceptionWrite: {}
java.io.IOException: Uszkodzona potok2021-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 chociaż procesor wiadomości nadal pisał
żądanie do serwera backendu, połączenie zostało przedwcześnie zamknięte przez
z serwera backendu. Dlatego procesor wiadomości zgłasza wyjątek
java.io.IOException: Broken pipe. Remote:IP:PORTwskazuje rozpoznany serwer backendu adres IP i numer portu.- Atrybut
bytesWritten=76295w powyższym komunikacie o błędzie wskazuje, że procesor wiadomości wysłał do backendu ładunek o długości76295bajtów serwera, gdy połączenie zostało przedwcześnie zamknięte. - Atrybut
bytesRead=0wskazuje, że procesor wiadomości nie odebrano jakiekolwiek dane (odpowiedź) z serwera backendu. - Aby dokładniej zbadać ten problem, zbierz w backendzie obiekt
tcpdumpserwera lub procesora wiadomości i przeanalizuj je w sposób opisany poniżej.
Korzystanie z tcpdump
-
Przechwyć interfejs
tcpdumpna serwerze backendu lub w procesorze wiadomości za pomocą następujące polecenia:Polecenie do gromadzenia danych
tcpdumpna serwerze backendu:tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
Polecenie do gromadzenia danych
tcpdumpw procesorze wiadomości:tcpdump -i any -s 0 host BACKEND_HOSTNAME -w FILE_NAME
- Przeanalizuj przechwycone dane (
tcpdump):Przykładowe dane wyjściowe tcpdump (zbierane przez procesor wiadomości):

W sekcji
tcpdumppowyżej możesz zobaczyć:- W pakiecie
4procesor wiadomości wysłał żądaniePOSTdo do serwera backendu. - W pakiecie
5,8,9,10,11, procesor wiadomości nadal wysyłał ładunek żądania do z serwera backendu. - W pakiecie
6i7serwer backendu odpowiedział żądaniemACKdla części ładunku żądania otrzymanego z procesora wiadomości. - Jednak w pakiecie
12, zamiast odpowiadać z użyciemACKdla odebranych pakietów danych aplikacji, a następnie odpowiadając ładunek, serwer backendu wysyła w odpowiedzi tagFIN ACKinicjujący zamknięcie połączenia. - Widać to wyraźnie, że serwer backendu przedwcześnie zamyka połączenie. gdy procesor wiadomości wciąż wysyłał ładunek żądania.
- Powoduje to, że procesor wiadomości rejestruje
IOException: Broken Pipei zwróć klientowi503
- W pakiecie
Rozdzielczość
- Nawiąż współpracę z zespołami ds. aplikacji i sieci (albo z zespołami ds. aplikacji i sieci), aby przeanalizować i naprawić z przedwczesnymi odłączeniami po stronie serwera backendu.
- Upewnij się, że aplikacja serwera backendu nie przekracza limitu czasu oczekiwania ani nie resetuje połączenia przed otrzymaniem całego ładunku żądania.
- Jeśli masz urządzenie lub warstwę pośredniczącą między Apigee a serwerem backendu, upewnij się, że nie przekroczono limitu czasu przed otrzymaniem całego ładunku żądania.
Jeśli problem nadal występuje, przeczytaj artykuł Wymagane są informacje diagnostyczne.
Musi zbierać informacje diagnostyczne
Jeśli po wykonaniu powyższych czynności problem nie ustąpi, zwróć uwagę na informacje diagnostyczne, a następnie skontaktuj się z zespołem pomocy Apigee Edge:
Jeśli jesteś użytkownikiem Public Cloud, 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 typu
503nie występują obecnie, podaj przedział czasu za pomocą funkcji informacje o strefie czasowej, gdy w przeszłości wystąpiły błędy503.
Jeśli jesteś użytkownikiem Private Cloud, podaj te informacje:
- Pełny komunikat o błędzie zaobserwowany dla nieudanych żądań
- Organizacja, nazwa środowiska i nazwa serwera proxy interfejsu API, które obserwujesz
503błędu - Pakiet serwera 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 wiadomości
/opt/apigee/var/log/edge-message-processor/logs/system.log - Przedział czasu z informacjami o strefie czasowej, w którym wystąpiły błędy
503. Tcpdumpssą zbierane przez procesory wiadomości i serwer backendu, gdy wystąpił błąd