Estás viendo la documentación de Apigee Edge.
Ve a la
Documentación de Apigee X. información
Síntoma
La aplicación cliente obtiene un estado de respuesta HTTP 503
con el mensaje.
Service Unavailable
después de una llamada de proxy de API.
Mensaje de error
La aplicación cliente obtiene el siguiente código de respuesta:
HTTP/1.1 503 Service Unavailable
Además, puedes observar el siguiente mensaje de error:
{ "fault": { "faultstring": "The Service is temporarily unavailable", "detail": { "errorcode": "messaging.adaptors.http.flow.ServiceUnavailable" } } }
Causas posibles
Causa | Descripción | Instrucciones de solución de problemas aplicables para |
---|---|---|
El servidor de destino cierra la conexión de forma prematura | El servidor de destino finaliza la conexión de forma prematura mientras el Message Processor está en reposo. envía la carga útil de la solicitud. | Usuarios perimetrales de nubes públicas y privadas |
Pasos comunes de diagnóstico
Determina el ID de mensaje de la solicitud con errores
Herramienta de seguimiento
Para determinar el ID del mensaje de la solicitud con errores mediante la herramienta Trace, haz lo siguiente:
- Si el problema aún está activo, habilita el de registro de la API afectada.
- Realiza la llamada a la API y reproduce el problema:
503 Service Unavailable
con el código de errormessaging.adaptors.http.flow.ServiceUnavailable.
- Selecciona una de las solicitudes fallidas.
- Navega a la fase AX y determina el ID del mensaje.
(
X-Apigee.Message-ID
) de la solicitud desplazándose hacia abajo en el Fase Details como se muestra en la siguiente figura.
Registros de acceso de NGINX
Para determinar el ID del mensaje de la solicitud con errores mediante los registros de acceso de NGINX, haz lo siguiente:
También puedes consultar los registros de acceso de NGINX para determinar el ID de mensaje para los errores 503
.
Esto es muy útil si el problema ocurrió en el pasado o si es intermitente.
y no puedes capturar el registro en la IU. Sigue estos pasos para determinar esta información a partir de los registros de acceso de NGINX:
- Verifica los registros de acceso de NGINX: (
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
). - Realiza una búsqueda para ver si hay errores
503
para el proxy de API específico durante un período específico (si el problema ocurrió en el pasado) o si hay solicitudes que aún fallan con503
. - Si hay errores
503
con X-Apigee-fault-code messages.adaptors.http.flow.ServiceUnavailable, ten en cuenta el ID del mensaje de una o más solicitudes, como se muestra en el siguiente ejemplo:Entrada de ejemplo que muestra el error
503
Causa: El servidor de destino cierra la conexión de forma prematura
Diagnóstico
- Si eres usuario de una nube pública o nube privada, ten en cuenta lo siguiente:
- Usar la herramienta Trace (como se explica en Pasos de diagnóstico comunes)
y verifica que hayas configurado las siguientes dos opciones en el panel Analytics Data Recorded:
- .
- X-Apigee.fault-code:
messaging.adaptors.http.flow.ServiceUnavailable
- X-Apigee.fault-source:
target
- X-Apigee.fault-code:
- Usar la herramienta Trace (como se explica en Pasos de diagnóstico comunes)
y verifica que estén configurados en el panel Error inmediatamente después de
La propiedad state
TARGET_REQ_FLOW
:- error.class:
com.apigee.errors.http.server.ServiceUnavailableException
- error.cause:
Broken pipe
- error.class:
- Para obtener más información, ve a Cómo usar tcpdump.
- Usar la herramienta Trace (como se explica en Pasos de diagnóstico comunes)
y verifica que hayas configurado las siguientes dos opciones en el panel Analytics Data Recorded:
- Si eres un usuario de la nube privada:
- Determina el ID del mensaje de la solicitud con errores.
- Busca el ID del mensaje en el registro de Message Processor.
(
/opt/apigee/var/log/edge-message-processor/logs/system.log
). - Verás una de las siguientes excepciones:
Excepción 1: java.io.IOException: Se produjo una canalización rota mientras se escribía en el canal 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)
o
Excepción n° 2: Excepción onExceptionWrite: {}
java.io.IOException: Canalización rota2021-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
- Ambas excepciones indican que, si bien el Message Processor aún escribía el
carga útil de la solicitud al servidor de backend, la conexión se cerró de forma prematura por el
de backend. Por lo tanto, Message Processor arroja la excepción
java.io.IOException: Broken pipe
. Remote:IP:PORT
indica el servidor de backend resuelto. la dirección IP y el número de puerto.- El atributo
bytesWritten=76295
en el mensaje de error anterior indica que el Message Processor había enviado una carga útil de76295
bytes al backend cuando la conexión se cerró de forma prematura. - El atributo
bytesRead=0
indica que Message Processor recibieron datos (respuesta) del servidor de backend. - Para investigar más a fondo este problema, recopila un
tcpdump
en el backend. o Message Processor, y analizarlo como se explica a continuación.
Cómo usar tcpdump
-
Captura un
tcpdump
en el servidor de backend o en Message Processor con los siguientes comandos:Comando para recopilar
tcpdump
en el servidor de backend:tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
Comando para recopilar
tcpdump
en Message Processor:tcpdump -i any -s 0 host BACKEND_HOSTNAME -w FILE_NAME
- Analiza el
tcpdump
capturado:Ejemplo de resultado de tcpdump (recopilado en Message Processor):
En el
tcpdump
anterior, puedes ver lo siguiente:- En el paquete
4
, el Message Processor envió una solicitudPOST
a el servidor de backend. - En el paquete
5
,8
,9
,10
,11
, el Message Processor siguió enviando la carga útil de la solicitud al servidor de backend. - En los paquetes
6
y7
,el servidor de backend respondió conACK
para una parte de la carga útil de la solicitud que se recibió de Message Processor. - Sin embargo, en el paquete
12
, en lugar de responder con unACK
para los paquetes de datos de aplicación recibidos y, luego, responder con la respuesta carga útil, el servidor de backend responde con unFIN ACK
que inicia el cierre de la conexión. - Esto muestra claramente que el servidor de backend está cerrando la conexión de forma prematura mientras el procesador de mensajes seguía enviando la carga útil de la solicitud.
- De esta manera, Message Processor registre un elemento
IOException: Broken Pipe
y muestra un503
al cliente
- En el paquete
Solución
- Trabaja con tus equipos de redes y aplicaciones, o con ambos, para analizar y corregir el problema con las desconexiones prematuras del servidor backend.
- Asegúrate de que la aplicación del servidor de backend no esté agotado ni restablece la conexión antes de recibir toda la carga útil de la solicitud.
- Si tiene algún dispositivo de red o capa intermediaria entre Apigee y el servidor backend, y asegurarse de que no se agote el tiempo de espera antes de recibir toda la carga útil de la solicitud.
Si el problema persiste, consulta Recopila información de diagnóstico.
Se debe recopilar información de diagnóstico
Si el problema persiste, incluso después de seguir las instrucciones anteriores, reúne la siguiente información de diagnóstico y, luego, comunícate con el equipo de asistencia de Apigee Edge:
Si eres usuario de la nube pública, proporciona la siguiente información:
- Nombre de la organización
- Nombre del entorno
- Nombre del proxy de API
- Completa el comando
curl
para reproducir el error503
- Archivo de registro que contiene la solicitud con el error
503 Service Unavailable
- Si los errores
503
no se producen actualmente, proporciona el período con la información de la zona horaria cuando se produjeron errores503
en el pasado.
Si eres un usuario de la Nube privada, proporciona la siguiente información:
- Mensaje de error completo observado para las solicitudes fallidas
- Organización, nombre del entorno y nombre del proxy de API que está observando
503
de errores - Paquete de proxy de API
- Archivo de registro que contiene las solicitudes con el error
503 Service Unavailable
- Registros de acceso de NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- Registros del procesador de mensajes
/opt/apigee/var/log/edge-message-processor/logs/system.log
- El período con la información de la zona horaria en el que se produjeron los errores
503
Tcpdumps
recopilados en los procesadores de mensajes y el servidor backend cuando la se produjo un error