Você está lendo a documentação do Apigee Edge.
Acesse a
documentação da Apigee X. info
Sintoma
O aplicativo cliente recebe um status de resposta HTTP 503 com a mensagem
Service Unavailable após uma chamada de proxy de API.
Mensagem de erro
O aplicativo cliente recebe o seguinte código de resposta:
HTTP/1.1 503 Service Unavailable
Além disso, você pode observar a seguinte mensagem de erro:
{
"fault": {
"faultstring": "The Service is temporarily unavailable",
"detail": {
"errorcode": "messaging.adaptors.http.flow.ServiceUnavailable"
}
}
}Causas possíveis
| Causa | Descrição | Instruções de solução de problemas aplicáveis para |
|---|---|---|
| O servidor de destino fecha a conexão prematuramente | O servidor de destino encerra a conexão prematuramente enquanto o processador de mensagens ainda está enviando o payload da solicitação. | Usuários da nuvem pública e privada do Edge |
Etapas comuns do diagnóstico
Determinar o ID da mensagem da solicitação com falha
Ferramenta Trace
Para determinar o ID da mensagem da solicitação com falha usando a ferramenta Trace:
- Se o problema ainda estiver ativo, ative a sessão de rastreamento da API afetada.
- Faça a chamada de API e reproduza o problema:
503 Service Unavailablecom o código de erromessaging.adaptors.http.flow.ServiceUnavailable. - Selecione uma das solicitações com falha.
- Navegue até a fase AX e determine o ID da mensagem
(
X-Apigee.Message-ID) da solicitação rolando para baixo na seção Detalhes da fase, conforme mostrado na figura a seguir.
Registros de acesso do NGINX
Para determinar o ID da mensagem da solicitação com falha usando os registros de acesso do NGINX:
Você também pode consultar os registros de acesso do NGINX para determinar o ID da mensagem dos erros 503.
Isso é especialmente útil se o problema tiver ocorrido no passado ou se o problema é intermitente
e você não consegue capturar o rastreamento na interface. Siga estas etapas para determinar essas informações nos registros de acesso do NGINX:
- Verifique os registros de acesso do NGINX: (
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log) - Pesquise para verificar se há erros
503para o proxy de API específico durante um período específico (se o problema ocorreu no passado) ou se ainda há solicitações com falha com503. - Se houver erros
503com X-Apigee-fault-code messaging.adaptors.http.flow.ServiceUnavailable, anote o ID da mensagem para uma ou mais dessas solicitações, conforme mostrado no exemplo a seguir:Exemplo de entrada mostrando o erro
503
Causa: o servidor de destino fecha a conexão prematuramente
Diagnóstico
- Se você for um usuário da nuvem pública ou da nuvem privada :
- Use a ferramenta Trace (conforme explicado em Etapas comuns do diagnóstico)
e verifique se você tem as duas opções a seguir definidas no painel Dados de análise gravados:
- X-Apigee.fault-code:
messaging.adaptors.http.flow.ServiceUnavailable - X-Apigee.fault-source:
target

- X-Apigee.fault-code:
- Use a ferramenta Trace (conforme explicado em Etapas comuns do diagnóstico)
e verifique se você tem as duas opções a seguir definidas no painel Erro imediatamente após
a propriedade
TARGET_REQ_FLOWstate:- error.class::
com.apigee.errors.http.server.ServiceUnavailableException - error.cause::
Broken pipe

- error.class::
- Acesse Como usar o tcpdump para mais investigações.
- Use a ferramenta Trace (conforme explicado em Etapas comuns do diagnóstico)
e verifique se você tem as duas opções a seguir definidas no painel Dados de análise gravados:
- Se você for um usuário da nuvem privada :
- Determine o ID da mensagem da solicitação com falha.
- Pesquise o ID da mensagem no registro do processador de mensagens
(
/opt/apigee/var/log/edge-message-processor/logs/system.log). - Você verá uma das seguintes exceções:
Exceção nº 1: java.io.IOException: Broken pipe occurred while writing to channel 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)
ou
Exceção nº 2: onExceptionWrite exception: {}
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
- Essas duas exceções indicam que, enquanto o processador de mensagens ainda estava gravando o
payload da solicitação no servidor de back-end, a conexão foi fechada prematuramente pelo
servidor de back-end. Portanto, o processador de mensagens gera a exceção
java.io.IOException: Broken pipe. - O
Remote:IP:PORTindica o endereço IP e o número da porta do servidor de back-end resolvido. - O atributo
bytesWritten=76295na mensagem de erro acima indica que o processador de mensagens enviou um payload de76295bytes para o servidor de back-end quando a conexão foi fechada prematuramente. - O atributo
bytesRead=0indica que o processador de mensagens não recebeu nenhum dado (resposta) do servidor de back-end. - Para investigar esse problema, colete um
tcpdumpno servidor de back-end ou no processador de mensagens e analise-o conforme explicado abaixo.
Como usar o tcpdump
-
Capture um
tcpdumpno servidor de back-end ou no processador de mensagens com os seguintes comandos:Comando para coletar
tcpdumpno servidor de back-end:tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
Comando para coletar
tcpdumpno processador de mensagens:tcpdump -i any -s 0 host BACKEND_HOSTNAME -w FILE_NAME
- Analise o
tcpdumpcapturado:Exemplo de saída de tcpdump (coletado no processador de mensagens):

No
tcpdumpacima, você pode conferir o seguinte:- No pacote
4, o processador de mensagens enviou uma solicitaçãoPOSTpara o servidor de back-end. - No pacote
5,8,9,10,11, o processador de mensagens continuou enviando o payload da solicitação para o servidor de back-end. - Nos pacotes
6e7,o servidor de back-end respondeu comACKpara uma parte do payload da solicitação recebida do processador de mensagens. - No entanto, no pacote
12, em vez de responder com umACKpara os pacotes de dados do aplicativo recebidos e, posteriormente, responder com o payload da resposta , o servidor de back-end responde com umFIN ACKiniciando o fechamento da conexão. - Isso mostra claramente que o servidor de back-end está fechando a conexão prematuramente enquanto o processador de mensagens ainda estava enviando o payload da solicitação.
- Isso faz com que o processador de mensagens registre um
IOException: Broken Pipeerro e retorne um503ao cliente.
- No pacote
Resolução
- Trabalhe com as equipes de aplicativos e de rede para analisar e corrigir o problema com as desconexões prematuras no lado do servidor de back-end.
- Verifique se o aplicativo do servidor de back-end não está excedendo o tempo limite ou redefinindo a conexão antes de receber todo o payload da solicitação.
- Se você tiver algum dispositivo ou camada de rede intermediária entre a Apigee e o servidor de back-end, verifique se eles não estão excedendo o tempo limite antes que todo o payload da solicitação seja recebido.
Se o problema persistir, acesse Precisa de informações de diagnóstico.
É necessário coletar informações de diagnóstico
Se o problema persistir mesmo depois de seguir as instruções acima, reúna as seguintes informações de diagnóstico e entre em contato com o Suporte da Apigee Edge:
Se você for um usuário da nuvem pública, forneça as seguintes informações:
- Nome da organização
- Nome do ambiente
- Nome do proxy da API
- Comando
curlcompleto para reproduzir o erro503 - Arquivo de rastreamento que contém a solicitação com o erro
503 Service Unavailable - Se os erros
503não estiverem ocorrendo no momento, forneça o período com as informações de fuso horário em que os erros503ocorreram no passado.
Se você for um usuário da nuvem privada, forneça as seguintes informações:
- Mensagem de erro completa observada para as solicitações com falha
- Nome da organização, do ambiente e do proxy de API para o qual você está observando
503erros - Pacote de proxy de API
- Arquivo de rastreamento que contém as solicitações com o erro
503 Service Unavailable - Registros de acesso do NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log - Registros do processador de mensagens
/opt/apigee/var/log/edge-message-processor/logs/system.log - O período com as informações de fuso horário em que os erros
503ocorreram Tcpdumpscoletados nos processadores de mensagens e no servidor de back-end quando o erro ocorreu