Estás consultando la documentación de Apigee Edge.
Consulta 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 a la API.
Mensaje de error
La aplicación cliente obtiene el siguiente código de respuesta:
HTTP/1.1 503 Service Unavailable
Además, es posible que veas 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 aún envía la carga útil de la solicitud. | Usuarios de la nube pública y privada de Edge |
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 con la herramienta Trace, sigue estos pasos:
- Si el problema sigue activo, habilita la sesión de seguimiento para la API afectada.
- Realiza una 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 con errores.
- Navega a la fase AX y determina el ID del mensaje (
X-Apigee.Message-ID
) de la solicitud. Para ello, desplázate hacia abajo en la sección Phase Details, como se muestra en la siguiente imagen.
Registros de acceso de NGINX
Para determinar el ID del mensaje de la solicitud con errores mediante los registros de acceso de NGINX, sigue estos pasos:
También puedes consultar los registros de acceso de NGINX para determinar el ID del 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 alguna solicitud que aún falla con503
. - Si hay errores
503
con X-Apigee-fault-code Messaging.adaptors.http.flow.ServiceAvailable, toma 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 una nube privada, haz lo siguiente:
- Usa la herramienta Trace (como se explica en Pasos comunes para el diagnóstico)
y verifica que las siguientes opciones estén configuradas en el panel Datos de Analytics registrados:
- X-Apigee.fault-code:
messaging.adaptors.http.flow.ServiceUnavailable
- X-Apigee.fault-source:
target
- X-Apigee.fault-code:
- Usa la herramienta de seguimiento (como se explica en Pasos comunes de diagnóstico) y verifica que las dos opciones siguientes estén configuradas en el panel Error justo después de la propiedad state
TARGET_REQ_FLOW
:- error.class:
com.apigee.errors.http.server.ServiceUnavailableException
. - error.cause:
Broken pipe
- error.class:
- Ve a Cómo usar tcpdump para obtener más información.
- Usa la herramienta Trace (como se explica en Pasos comunes para el diagnóstico)
y verifica que las siguientes opciones estén configuradas en el panel Datos de Analytics registrados:
- Si eres usuario de una nube privada, haz lo siguiente:
- 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 un error en la canalización 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.o 2: Excepción onExceptionWrite: {}
java.io.IOException: Canal roto2021-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, mientras Message Processor aún estaba escribiendo la carga útil de la solicitud en el servidor de backend, el servidor de backend cerró la conexión de forma prematura. Por lo tanto, Message Processor arroja la excepción
java.io.IOException: Broken pipe
. - El
Remote:IP:PORT
indica el número de puerto y la dirección IP del servidor de backend resuelto. - El atributo
bytesWritten=76295
del mensaje de error anterior indica que el procesador de mensajes envió una carga útil de76295
bytes al servidor de backend cuando la conexión se cerró de forma prematura. - El atributo
bytesRead=0
indica que Message Processor no recibió ningún dato (respuesta) del servidor de backend. - Para investigar este problema con más detalle, recopila un
tcpdump
en el servidor de backend o en el procesador de mensajes y analízalo como se explica a continuación.
Usa tcpdump
-
Captura un
tcpdump
en el servidor de backend o en el 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 reunir
tcpdump
en el procesador de mensajes:tcpdump -i any -s 0 host BACKEND_HOSTNAME -w FILE_NAME
- Analiza los
tcpdump
capturados:Resultado de ejemplo de tcpdump (recopilado en Message Processor):
En el
tcpdump
anterior, podrás ver lo siguiente:- En el paquete
4
, Message Processor envió una solicitudPOST
al servidor de backend. - En los paquetes
5
,8
,9
,10
y11
, el procesador de mensajes continuó 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 recibida del Message Processor. - Sin embargo, en el paquete
12
, en lugar de responder con unaACK
para los paquetes de datos de aplicación recibidos y, luego, responder con la carga útil de la respuesta, el servidor de backend responde con unaFIN ACK
que inicia el cierre de la conexión. - Esto muestra con claridad que el servidor de backend cierra la conexión de forma prematura mientras el Message Processor aún estaba enviando la carga útil de la solicitud.
- Esto hace que Message Processor registre un error
IOException: Broken Pipe
y muestre un503
al cliente.
- En el paquete
Resolución
- Trabaja con tus equipos de aplicaciones y redes, o con ambos, para analizar y solucionar el problema de las desconexiones prematuras del servidor de backend.
- Asegúrate de que la aplicación del servidor de backend no agote el tiempo de espera ni restablezca la conexión antes de recibir toda la carga útil de la solicitud.
- Si tienes una capa o un dispositivo de red intermedio entre Apigee y el servidor de backend, asegúrate de que no se agote el tiempo de espera antes de que se reciba 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, recopila la siguiente información de diagnóstico y, luego, comunícate con el equipo de asistencia de Apigee Edge:
Si eres un 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 seguimiento que contiene la solicitud con el error
503 Service Unavailable
- Si en este momento no se producen los errores
503
, 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 con errores
- Organización, nombre del entorno y nombre del proxy de API para los que observas
errores
503
- Paquete de proxy de API
- Archivo de seguimiento 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 de Message Processor
/opt/apigee/var/log/edge-message-processor/logs/system.log
- El período con la información de zona horaria en el que se produjeron los errores
503
- Se recopilaron
Tcpdumps
en los procesadores de mensajes y el servidor de backend cuando se produjo el error.