L'erreur « Invocation canceled by client » indique que le client s'est déconnecté avant la fin de l'exécution de la fonction. Function Compute interrompt alors l'exécution et consigne cette erreur dans les journaux.
Message d'erreur
Le journal des requêtes affiche l'erreur suivante :
FC Invoke End RequestId: 1-64263a4b-2cd7c98b677*********, Error: Invocation canceled by client (duration: 4912ms, maxMemoryUsage: 0.00MB)
Cause
Cette erreur survient lorsque le client annule la requête avant la fin de l'exécution de la fonction, ce qui provoque son interruption.
Les causes les plus fréquentes sont les suivantes :
Le délai d'attente côté client est inférieur à la durée d'exécution effective de la fonction.
Un utilisateur a annulé manuellement la requête, par exemple en cliquant sur Cancel Request dans la console Function Compute ou en fermant l'onglet du navigateur.
Un service intermédiaire (tel qu'API Gateway) impose un délai d'attente backend plus court que la durée d'exécution de la fonction.
Solution
Étape 1 : Vérifier la durée d'exécution
Récupérez la valeur duration dans le message d'erreur pour connaître le temps d'exécution écoulé avant la déconnexion du client.
Dans l'exemple ci-dessus, duration: 4912ms indique que la fonction s'est exécutée pendant environ 5 secondes.
Étape 2 : Évaluer si cette durée est normale
Comparez la durée observée au temps d'exécution attendu pour votre fonction :
La durée est normale : la fonction s'est exécutée aussi longtemps que prévu, mais le délai d'attente du client était trop court. Consultez la section Augmenter le délai d'attente côté client.
La durée est anormale : la fonction a mis plus de temps que prévu. Consultez la section Réduire le temps d'exécution de la fonction.
Augmenter le délai d'attente côté client
Si la durée d'exécution de la fonction correspond aux attentes, le délai d'attente du client est insuffisant. Ajustez ce paramètre selon la méthode d'appel utilisée :
Appel via SDK ou API
Définissez un délai d'attente côté client supérieur au délai configuré pour la fonction.
Exemple en Go : configurez le délai via la propriété Timeout de http.Client. Si vous utilisez context.Context pour initier la requête, ajustez plutôt la date limite ou le délai d'attente du contexte.
// Set the HTTP client timeout to 120 seconds
client := &http.Client{
Timeout: 120 * time.Second,
}
Appel via un autre service
Si un autre service Alibaba Cloud (comme API Gateway) déclenche la fonction, modifiez le délai d'attente backend de ce service.
Exemple avec API Gateway : ajustez les paramètres de délai d'attente backend dans la console API Gateway. Pour plus d'informations, consultez Créer une API.
Appel depuis la console
Lorsque vous appelez une fonction depuis la console Function Compute, ne cliquez pas sur Cancel Request et ne fermez pas l'onglet du navigateur avant la fin de l'exécution.
Réduire le temps d'exécution de la fonction
Si la fonction prend plus de temps que prévu, analysez ses journaux pour identifier le goulot d'étranglement. La latence des E/S et les opérations intensives en calcul constituent les deux causes les plus courantes.
Opérations d'E/S
Les E/S réseau représentent la principale source de latence inattendue. Ajoutez des entrées de journal avant et après chaque appel externe (requêtes de base de données, appels API, opérations de stockage) afin d'isoler l'appel lent.
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")
Opérations de calcul
Des traitements exigeants en CPU peuvent également allonger la durée d'exécution. Si le profilage confirme un goulot d'étranglement lié au calcul, augmentez les spécifications CPU allouées à la fonction.