Вы просматриваете документацию Apigee Edge .
Перейдите к документации Apigee X. информация
Симптом
Клиентское приложение получает статус ответа HTTP 503
с сообщением Service Unavailable
после вызова прокси-сервера API.
Сообщение об ошибке
Клиентское приложение получает следующий код ответа:
HTTP/1.1 503 Service Unavailable
Кроме того, вы можете увидеть следующее сообщение об ошибке:
{ "fault": { "faultstring": "The Service is temporarily unavailable", "detail": { "errorcode": "messaging.adaptors.http.flow.ServiceUnavailable" } } }
Возможные причины
Причина | Описание | Инструкции по устранению неполадок применимы для |
---|---|---|
Целевой сервер преждевременно закрывает соединение | Целевой сервер преждевременно завершает соединение, пока процессор сообщений все еще отправляет полезную нагрузку запроса. | Пользователи Edge Public и Private Cloud |
Общие этапы диагностики
Определите идентификатор сообщения неудачного запроса.
Инструмент трассировки
Чтобы определить идентификатор сообщения неудачного запроса с помощью инструмента трассировки:
- Если проблема все еще активна, включите сеанс трассировки для затронутого API.
- Выполните вызов API и воспроизведите проблему —
503 Service Unavailable
с кодом ошибкиmessaging.adaptors.http.flow.ServiceUnavailable.
- Выберите один из невыполненных запросов.
- Перейдите к этапу AX и определите идентификатор сообщения (
X-Apigee.Message-ID
) запроса, прокрутив вниз раздел «Сведения о этапе» , как показано на следующем рисунке.
Журналы доступа NGINX
Чтобы определить идентификатор сообщения неудачного запроса с помощью журналов доступа NGINX:
Вы также можете обратиться к журналам доступа NGINX, чтобы определить идентификатор сообщения для ошибок 503
. Это особенно полезно, если проблема возникала в прошлом или если проблема носит периодический характер и вы не можете отследить ее в пользовательском интерфейсе. Используйте следующие шаги, чтобы получить эту информацию из журналов доступа NGINX:
- Проверьте журналы доступа NGINX: (
/opt/apigee/var/log/edge-router/nginx/ ORG ~ ENV . PORT# _access_log
) - Выполните поиск, чтобы узнать, есть ли какие-либо ошибки
503
для конкретного прокси-сервера API в течение определенного периода времени (если проблема возникла в прошлом) или есть ли какие-либо запросы, которые по-прежнему завершаются с ошибкой503
. - Если есть какие-либо ошибки
503
с X-Apigee-fault-code messages.adaptors.http.flow.ServiceUnavailable , запишите идентификатор сообщения для одного или нескольких таких запросов, как показано в следующем примере:Пример записи, показывающий ошибку
503
Причина: целевой сервер преждевременно закрывает соединение.
Диагностика
- Если вы являетесь пользователем публичного или частного облака :
- Используйте инструмент «Трассировка» (как описано в разделе «Общие шаги диагностики» ) и убедитесь, что на панели «Записанные аналитические данные» установлены оба следующих параметра:
- X-Apigee.fault-код:
messaging.adaptors.http.flow.ServiceUnavailable
- X-Apigee.fault-source:
target
- X-Apigee.fault-код:
- Используйте инструмент «Трассировка» (как описано в разделе «Общие шаги диагностики» ) и убедитесь, что на панели «Ошибка» сразу после свойства состояния
TARGET_REQ_FLOW
установлены оба следующих параметра:- error.class:
com.apigee.errors.http.server.ServiceUnavailableException
- ошибка.причина:
Broken pipe
- error.class:
- Перейдите к разделу «Использование tcpdump» для дальнейшего изучения.
- Используйте инструмент «Трассировка» (как описано в разделе «Общие шаги диагностики» ) и убедитесь, что на панели «Записанные аналитические данные» установлены оба следующих параметра:
- Если вы являетесь пользователем частного облака :
- Определите идентификатор сообщения неудачного запроса.
- Найдите идентификатор сообщения в журнале процессора сообщений (
/opt/apigee/var/log/edge-message-processor/logs/system.log
). - Вы увидите одно из следующих исключений:
Исключение № 1: java.io.IOException: произошел разрыв канала при записи в канал 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)
или
Исключение № 2: исключение onExceptionWrite: {}
java.io.IOException: сломанная труба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
- Оба этих исключения указывают на то, что, хотя процессор сообщений все еще записывал полезные данные запроса на внутренний сервер, соединение было преждевременно закрыто внутренним сервером. Следовательно, процессор сообщений выдает исключение
java.io.IOException: Broken pipe
. -
Remote: IP : PORT
указывает разрешенный IP-адрес внутреннего сервера и номер порта. - Атрибут
bytesWritten=76295
в приведенном выше сообщении об ошибке указывает на то, что процессор сообщений отправил на внутренний сервер полезную нагрузку размером76295
байт, когда соединение было преждевременно закрыто. - Атрибут
bytesRead=0
указывает, что процессор сообщений не получил никаких данных (ответа) от внутреннего сервера. - Чтобы глубже изучить эту проблему, соберите
tcpdump
либо на внутреннем сервере, либо в процессоре сообщений и проанализируйте его, как описано ниже.
Использование tcpdump
Запишите
tcpdump
на внутреннем сервере или в процессоре сообщений с помощью следующих команд:Команда для сбора
tcpdump
на внутреннем сервере:tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
Команда для сбора данных
tcpdump
в процессоре сообщений:tcpdump -i any -s 0 host BACKEND_HOSTNAME -w FILE_NAME
- Проанализируйте захваченный
tcpdump
:Пример вывода tcpdump (собранный процессором сообщений):
В приведенном выше
tcpdump
вы можете увидеть следующее:- В пакете
4
процессор сообщений отправил запросPOST
на внутренний сервер. - В пакетах
5
,8
,9
,10
,11
процессор сообщений продолжал отправлять полезную нагрузку запроса на внутренний сервер. - В пакетах
6
и7
внутренний сервер ответилACK
на часть полезной нагрузки запроса, полученной от процессора сообщений. - Однако в пакете
12
вместо ответаACK
на полученные пакеты данных приложения и последующего ответа с ответной полезной нагрузкой внутренний сервер вместо этого отвечаетFIN ACK
инициируя закрытие соединения. - Это ясно показывает, что внутренний сервер преждевременно закрывает соединение, в то время как процессор сообщений все еще отправляет полезную нагрузку запроса.
- Это приводит к тому, что процессор сообщений записывает ошибку
IOException: Broken Pipe
и возвращает клиенту503
- В пакете
Разрешение
- Работайте с одной или обеими командами приложений и сетевых служб, чтобы проанализировать и устранить проблему с преждевременными отключениями на стороне внутреннего сервера.
- Убедитесь, что приложение внутреннего сервера не истекло по тайм-ауту и не сбрасывало соединение перед получением всей полезной нагрузки запроса.
- Если у вас есть какое-либо промежуточное сетевое устройство или уровень между Apigee и внутренним сервером, убедитесь, что у них не истекает время ожидания до получения всей полезной нагрузки запроса.
Если проблема не устранена, перейдите к разделу «Необходимо собрать диагностическую информацию» .
Необходимо собрать диагностическую информацию
Если проблема не устранена даже после выполнения приведенных выше инструкций, соберите следующую диагностическую информацию, а затем обратитесь в службу поддержки Apigee Edge :
Если вы являетесь пользователем Public Cloud , предоставьте следующую информацию:
- Название организации
- Имя среды
- Имя API-прокси
- Завершите команду
curl
, чтобы воспроизвести ошибку503
- Файл трассировки, содержащий запрос с ошибкой
503 Service Unavailable
- Если ошибки
503
в настоящее время не возникают, укажите период времени с информацией о часовом поясе, когда ошибки503
возникали в прошлом.
Если вы являетесь пользователем частного облака , предоставьте следующую информацию:
- Полное сообщение об ошибке, наблюдаемое для неудачных запросов
- Организация, имя среды и имя прокси-сервера API, для которых вы наблюдаете ошибки
503
- Пакет API-прокси
- Файл трассировки, содержащий запросы с ошибкой
503 Service Unavailable
- Журналы доступа NGINX
/opt/apigee/var/log/edge-router/nginx/ ORG ~ ENV . PORT# _access_log
- Журналы процессора сообщений
/opt/apigee/var/log/edge-message-processor/logs/system.log
- Период времени с информацией о часовом поясе, когда произошла ошибка
503
-
Tcpdumps
, собранные на процессорах сообщений и внутреннем сервере при возникновении ошибки.