Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee X.info
Симптом
После вызова API-прокси клиентское приложение получает HTTP-ответ со статусом 503 и сообщением Service Unavailable .
Сообщение об ошибке
Клиентское приложение получает следующий код ответа:
HTTP/1.1 503 Service Unavailable
Кроме того, вы можете увидеть следующее сообщение об ошибке:
{
"fault": {
"faultstring": "The Service is temporarily unavailable",
"detail": {
"errorcode": "messaging.adaptors.http.flow.ServiceUnavailable"
}
}
}Возможные причины
| Причина | Описание | Инструкции по устранению неполадок, применимые для |
|---|---|---|
| Целевой сервер преждевременно закрывает соединение. | Целевой сервер преждевременно разрывает соединение, пока обработчик сообщений еще отправляет полезную нагрузку запроса. | Пользователи публичных и частных облачных сервисов на периферии сети |
Общие этапы диагностики
Определите идентификатор сообщения (Message ID) запроса, завершившегося с ошибкой.
инструмент трассировки
Чтобы определить идентификатор сообщения, в котором произошел сбой запроса, используя инструмент трассировки:
- Если проблема сохраняется, включите сеанс трассировки для затронутого 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 messaging.adaptors.http.flow.ServiceUnavailable , запишите идентификатор сообщения для одного или нескольких таких запросов, как показано в следующем примере:Пример записи, демонстрирующей ошибку
503
Причина: Целевой сервер преждевременно закрывает соединение.
Диагноз
- Если вы являетесь пользователем публичного или частного облака :
- Используйте инструмент «Трассировка» (как описано в разделе «Общие шаги диагностики» ) и убедитесь, что в панели «Записанные аналитические данные» установлены оба следующих параметра:
- X-Apigee.fault-code:
messaging.adaptors.http.flow.ServiceUnavailable - X-Apigee.fault-source:
target

- X-Apigee.fault-code:
- Используйте инструмент трассировки (как описано в разделе «Общие шаги диагностики ») и убедитесь, что в панели ошибок сразу после свойства состояния
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: Произошла ошибка "Broken pipe" при записи в канал 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: 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
- Оба эти исключения указывают на то, что пока обработчик сообщений еще записывал полезную нагрузку запроса на серверную часть, соединение было преждевременно закрыто серверной частью. Следовательно, обработчик сообщений выдает исключение
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 :
Если вы являетесь пользователем публичного облака , предоставьте следующую информацию:
- Название организации
- Название среды
- Имя 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были собраны на процессорах сообщений и бэкэнд-сервере в момент возникновения ошибки.