O erro "Invocation canceled by client" indica que o cliente se desconectou antes da conclusão da execução da função. O Function Compute interrompe a execução e registra o erro no log.
Mensagem de erro
O seguinte erro aparece no log da requisição:
FC Invoke End RequestId: 1-64263a4b-2cd7c98b677*********, Error: Invocation canceled by client (duration: 4912ms, maxMemoryUsage: 0.00MB)
Causa
O cliente cancelou a requisição antes da conclusão da função, o que interrompe a execução e gera o erro.
Gatilhos comuns incluem:
Tempo limite da requisição do cliente menor que a duração da execução da função.
Cancelamento manual da requisição por um usuário (por exemplo, ao clicar em Cancel Request no console do Function Compute ou fechar a aba do navegador).
Serviço intermediário (como API Gateway) com tempo limite de backend inferior à duração da execução da função.
Solução
Etapa 1: Verificar a duração da execução
Extraia o valor de duration da mensagem de erro para identificar quanto tempo a função executou antes da desconexão do cliente.
No exemplo acima, duration: 4912ms significa que a função executou por aproximadamente 5 segundos.
Etapa 2: Determinar se a duração é esperada
Compare a duração obtida com o tempo de execução esperado para sua função:
Duração esperada: a função executou pelo tempo correto, mas o tempo limite do cliente expirou cedo demais. Consulte Aumentar o tempo limite do cliente.
Duração inesperada: a função demorou mais do que deveria. Consulte Reduzir o tempo de execução da função.
Aumentar o tempo limite do cliente
Se a duração da execução da função estiver dentro do esperado, o tempo limite do cliente está muito curto. Ajuste-o conforme o método de invocação:
Invocação via SDK ou api
Defina o tempo limite da requisição do cliente com um valor superior ao tempo limite configurado para a função.
Exemplo em Go: defina o tempo limite pela propriedade Timeout em http.Client. Se utilizar context.Context para iniciar a requisição, ajuste o prazo (deadline) ou o tempo limite do contexto.
// Set the HTTP client timeout to 120 seconds
client := &http.Client{
Timeout: 120 * time.Second,
}
Invocação por meio de outro serviço
Caso outro serviço da Alibaba Cloud (como API Gateway) acione a função, modifique o tempo limite de backend desse serviço.
Exemplo de API Gateway: ajuste as configurações de tempo limite de backend no console do API Gateway. Para obter detalhes, consulte Criar uma API.
Invocação pelo console
Ao invocar uma função pelo console do Function Compute, não clique em Cancel Request nem feche a aba do navegador antes da conclusão da execução.
Reduzir o tempo de execução da função
Se a função levar mais tempo do que o esperado, analise os logs para identificar o gargalo. As duas causas mais comuns são latência de E/S e operações intensivas em computação.
Operações de E/S
A E/S de rede é a principal causa de latência inesperada. Adicione logs antes e depois de cada chamada externa (consultas a banco de dados, requisições de api, operações de armazenamento) para isolar a chamada lenta.
import time, logging
start = time.time()
# Call to external service
response = external_service.query(params)
logging.info(f"External service call took {time.time() - start:.2f}s")
Operações de computação
Operações intensivas em CPU também podem aumentar a duração da execução. Se a análise de perfil confirmar um gargalo de computação, aumente as especificações de CPU alocadas para a função.