El error "Invocation canceled by client" indica que el cliente se desconectó antes de que la función terminara de ejecutarse. Function Compute interrumpe la ejecución y registra el error.
Mensaje de error
A continuación se muestra el error que aparece en el registro de la solicitud:
FC Invoke End RequestId: 1-64263a4b-2cd7c98b677*********, Error: Invocation canceled by client (duration: 4912ms, maxMemoryUsage: 0.00MB)
Causa
El cliente canceló la solicitud antes de que la función terminara, lo cual interrumpe la ejecución y genera el error.
Las causas más comunes son las siguientes:
El tiempo de espera de la solicitud del lado del cliente es menor que la duración de ejecución de la función.
Un usuario canceló manualmente la solicitud (por ejemplo, al hacer clic en Cancel Request en la consola de Function Compute o al cerrar la pestaña del navegador).
Un servicio intermediario (como API Gateway) aplicó un tiempo de espera del backend menor que la duración de ejecución de la función.
Solución
Paso 1: Compruebe la duración de la ejecución
Extraiga el valor duration del mensaje de error para conocer cuánto tiempo se ejecutó la función antes de que el cliente se desconectara.
En el ejemplo anterior, duration: 4912ms significa que la función se ejecutó durante aproximadamente 5 segundos.
Paso 2: Determine si la duración es la esperada
Compare la duración con el tiempo de ejecución esperado para su función:
La duración es la esperada: la función se ejecutó el tiempo necesario, pero el cliente agotó su tiempo de espera demasiado pronto. Consulte Aumente el tiempo de espera del cliente.
La duración no es la esperada: la función tardó más de lo previsto. Consulte Reduzca el tiempo de ejecución de la función.
Aumente el tiempo de espera del cliente
Si la duración de ejecución de la función está dentro de lo esperado, el tiempo de espera del cliente es demasiado corto. Ajuste este valor según la forma en que invoque la función:
Invocación mediante SDK o API
Establezca el tiempo de espera de la solicitud del lado del cliente en un valor mayor que el tiempo de espera configurado para la función.
Ejemplo en Go: establezca el tiempo de espera mediante la propiedad Timeout en http.Client. Si utiliza context.Context para iniciar la solicitud, ajuste el límite de tiempo o el tiempo de espera del contexto.
// Set the HTTP client timeout to 120 seconds
client := &http.Client{
Timeout: 120 * time.Second,
}
Invocación a través de otro servicio
Si otro servicio de Alibaba Cloud (como API Gateway) activa la función, modifique el tiempo de espera del backend de dicho servicio.
Ejemplo con API Gateway: ajuste la configuración del tiempo de espera del backend en la consola de API Gateway. Para obtener más información, consulte Create an API.
Invocación desde la consola
Cuando invoque una función desde la consola de Function Compute, no haga clic en Cancel Request ni cierre la pestaña del navegador antes de que la función termine de ejecutarse.
Reduzca el tiempo de ejecución de la función
Si la función tarda más de lo esperado, revise los registros de la función para identificar el cuello de botella. Las dos causas más comunes son la latencia de E/S y las operaciones intensivas en cómputo.
Operaciones de E/S
La E/S de red es la causa principal de la latencia inesperada. Agregue registros antes y después de cada llamada externa (consultas a bases de datos, solicitudes de API, operaciones de almacenamiento) para aislar la llamada 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")
Operaciones de cómputo
Las operaciones intensivas en CPU también pueden aumentar la duración de la ejecución. Si el análisis de rendimiento confirma un cuello de botella de cómputo, aumente las especificaciones de CPU asignadas a la función.