Lors du traitement des requêtes utilisateur, Function Compute alloue automatiquement une ou plusieurs instances. Chaque instance offre un environnement d'exécution sécurisé et isolé. Lors de la migration d'applications traditionnelles vers une architecture serverless, la nature éphémère de la création et de la destruction des instances peut entraîner des retards de mise à jour des données de surveillance, une latence des métriques ou une perte de données. Pour résoudre ces problèmes, Function Compute fournit des hooks de cycle de vie d'instance afin de garantir l'actualité et l'exhaustivité de vos données de surveillance.
Cycle de vie des instances de fonction
Les instances de fonction sont créées et détruites à la demande selon le volume d'invocations actuel de votre fonction. Le cycle de vie de chaque instance comprend trois phases : création de l'instance, invocation et destruction de l'instance, comme illustré dans la figure suivante.
Création
Durant la phase de création, Function Compute crée une instance de fonction selon la configuration de votre fonction. Dans cette phase, Function Compute exécute les tâches suivantes dans l'ordre :
Création de l'instance : chargement du code, chargement des couches ou extraction d'une image, puis démarrage de l'instance.
Initialisation du runtime.
Exécution du hook Initializer configuré. Pour plus d'informations, consultez Hook Initializer.
La création d'instance se produit généralement dans les deux scénarios suivants.
-
Mise à l'échelle élastique
Lorsqu'une requête d'invocation est reçue et que toutes les instances de fonction actuelles sont occupées, une nouvelle instance est créée pour traiter la requête. L'instance est créée immédiatement, puis le processus d'invocation commence. Cette mise à l'échelle élastique peut provoquer un démarrage à froid. Pour savoir comment atténuer ce problème, consultez Meilleures pratiques pour optimiser les démarrages à froid dans Function Compute.
-
Ajustement du nombre minimal d'instances
Si vous modifiez le nombre minimal d'instances configuré de 0 à 1 ou plus, Function Compute lance immédiatement le processus de création d'instance. Si aucune requête d'invocation n'est reçue à ce moment-là, un délai peut survenir entre la création de l'instance et la première invocation. Pour plus d'informations, consultez Configurer une politique élastique pour le nombre minimal d'instances.
Invocation
Pendant l'exécution d'une instance, Function Compute appelle le handler de votre fonction pour traiter les requêtes d'invocation. Durant la phase d'invocation, pour un runtime intégré, une instance ne traite qu'une seule requête à la fois. Pour un custom runtime ou un custom container runtime, une instance peut traiter plusieurs requêtes simultanément. Configurez la concurrence des instances pour activer cette fonctionnalité. Pour plus d'informations, consultez Configurer la concurrence des instances.
Function Compute facture uniquement le temps pendant lequel votre code s'exécute, y compris les requêtes et les handlers de hooks. Pendant les périodes d'inactivité entre les requêtes, l'instance est gelée et n'engendre aucun frais. Pour plus d'informations, consultez Facturation.
Destruction
Cette phase se déclenche si une instance de fonction ne reçoit aucune invocation pendant une certaine période. Durant la phase de destruction, Function Compute exécute d'abord le hook PreStop. Effectuez des tâches de nettoyage dans ce hook.
La destruction d'instance survient généralement dans les trois scénarios suivants.
Instance inactive : si une instance reste inactive pendant une période spécifiée, Function Compute la récupère automatiquement.
Ajustement du nombre minimal d'instances : lorsque vous réduisez le nombre minimal d'instances, Function Compute détruit immédiatement les instances excédentaires.
Exception d'instance : si une instance rencontre une erreur lors de la phase de création ou d'invocation, Function Compute la détruit.
Mécanisme de gel des instances
En l'absence de requêtes d'invocation, Function Compute gèle l'instance. Lorsqu'une nouvelle requête arrive, Function Compute dégèle l'instance. Ce processus est illustré dans la figure suivante.
Le gel d'une instance se produit principalement dans les deux situations suivantes :
Après la fin de la phase d'initialisation de l'instance, mais avant la première invocation.
Après la fin d'une invocation, mais avant le début de la suivante.
Une fois une invocation terminée, Function Compute gèle l'instance de fonction. Tous les processus d'arrière-plan, threads ou coroutines de votre code sont suspendus et ne peuvent pas continuer. Cela peut empêcher l'écriture correcte des journaux asynchrones.
Limites
Pour les fonctions accélérées par GPU, le hook Initializer prend en charge deux types : Code Invocation et Command Execution. Un seul de ces types peut être activé à la fois.
Pour les fonctions déclenchées par événement, web et task, le hook Initializer prend uniquement en charge le type Code Invocation.
Le hook PreStop prend uniquement en charge le type Code Invocation. Tous les runtimes prennent en charge le hook PreStop.
Les paramètres d'entrée d'une méthode de hook PreStop n'incluent pas de paramètre d'événement.
Le hook PreStop ne renvoie aucune valeur ; toute logique de retour dans votre fonction est ignorée.
Si vous utilisez le runtime Java, mettez à jour fc-java-core vers la version 1.4.0 ou ultérieure. Sinon, le hook PreStop ne sera pas disponible.
Ne supposez pas que les opérations asynchrones, telles que les threads d'arrière-plan ou la vidange des journaux, se termineront avant le gel de l'instance.
La méthode de configuration des hooks de type Code Invocation varie selon le runtime. Pour un runtime intégré, définissez un point d'entrée personnalisé lors de la configuration d'un hook de cycle de vie. Par exemple, si vous définissez le handler du hook Initializer sur
index.initialize, ajoutez une fonction de hookinitializeà votre code. En revanche, pour les custom runtimes et custom container runtimes, après avoir configuré les hooks Initializer et PreStop, le système envoie une requête HTTP (POST /initialize ou GET /pre-stop) à votre fonction lorsque l'instance démarre ou s'arrête. Votre code d'application doit traiter ces requêtes.
Facturation
Les invocations des hooks de cycle de vie d'instance n'entraînent pas de frais de requête. Les autres frais sont calculés selon la même logique que pour la phase d'invocation d'instance. La durée facturable est illustrée dans la figure suivante. Pour plus d'informations sur la facturation, consultez Vue d'ensemble de la facturation.
Prérequis
Une fonction a été créée. Pour plus d'informations, consultez Créer une fonction.
Configurer les hooks de cycle de vie d'instance
Console
Connectez-vous à la console Function Compute. Dans le volet de navigation de gauche, choisissez .
Dans la barre de navigation supérieure, sélectionnez une région. Sur la page Functions, cliquez sur la fonction cible.
Sur la page de détails de la fonction, cliquez sur l'onglet Configuration, puis cliquez sur Instance Configuration dans la section Modify.
-
Dans le panneau Instance Configuration, configurez le hook Initializer et son délai d'expiration.
Cette rubrique prend une fonction accélérée par GPU comme exemple pour décrire la configuration d'un hook Initializer. Pour les fonctions déclenchées par événement, web et task, le hook Initializer prend uniquement en charge le type Code Invocation. Suivez les étapes décrites dans cette rubrique pour le type Code Invocation.
-
Sélectionnez le type Code Invocation
Activez le commutateur Initializer hook et définissez le Initializer hook timeout sur
300secondes. Une fois cette fonctionnalité activée, Function Compute envoie une requête HTTP POST /initialize à la fonction lorsqu'une instance démarre. Une réponse 200 indique un succès, tandis qu'une réponse 4xx ou 5xx provoque une erreur ou un redémarrage de l'instance. -
Sélectionnez le type Command Execution
Activez le commutateur Initializer hook, définissez le Initializer hook timeout sur
300secondes, et définissez Command sur>/bin/sh. Dans l'éditeur de code, écrivez un script shell pour envoyer une requête POST de vérification d'état à l'API Stable Diffusion locale. Définissez l'URL surhttp://localhost:7860et le REQUEST_PATH sursdapi/v1/txt2img. Construisez une charge utile JSON comprenant les champsprompt,steps,heightetwidth, puis utilisez curl pour envoyer la requête.
-
Dans le panneau Instance Configuration, configurez le hook PreStop et son délai d'expiration, puis cliquez sur Deploy.
-
Si vous avez configuré un hook de type Code Invocation, implémentez la fonction correspondante dans votre code.
-
Cliquez sur l'onglet Code. Dans l'éditeur de code, ajoutez la logique de la fonction de hook.
Par exemple, si vous avez configuré le handler du hook PreStop sur
index.preStop, implémentez la fonction preStop dans votre code. Pour savoir comment implémenter les hooks de cycle de vie d'instance pour différents runtimes, consultez Hooks de cycle de vie pour les instances de fonction.RemarqueL'IDE en ligne prend en charge PHP, Python, Node.js et les custom runtimes, mais ne prend pas en charge les langages compilés tels que Java, Go et .NET, ni les custom container runtimes.
Au-dessus de l'éditeur de code, cliquez sur Deploy, puis cliquez sur Test Function.
-
Serverless Devs
Lorsque vous utilisez Serverless Devs pour configurer un hook Initializer, l'extrait de code dans votre fichier s.yaml ressemble à l'exemple suivant :
codeUri: './code.zip'
......
instanceLifecycleConfig:
initializer:
timeout: 60
command:
- /bin/sh
- -c
- echo "hello"
Pour désactiver un hook, définissez explicitement ses paramètres handler et command sur des chaînes vides. Cela est nécessaire car le backend n'applique pas la mise à jour autrement. Par exemple, pour désactiver le hook Initializer, déployez la configuration suivante. Les paramètres timeout et command du hook Initializer seront alors ignorés.
codeUri: './code.zip'
......
instanceLifecycleConfig:
initializer:
handler: ""
timeout: 60
command: ""
Pour savoir comment implémenter les hooks de cycle de vie d'instance pour différents runtimes, consultez Hooks de cycle de vie pour les instances de fonction.
SDK
Utilisez un SDK pour déployer et mettre à jour des hooks. Cette section décrit comment obtenir un exemple de code SDK pour configurer des hooks lors de la création d'une fonction.
Accédez à la rubrique de référence de l'API CreateFunction et cliquez sur Debug pour ouvrir le portail OpenAPI.
-
Dans l'onglet Parameters, spécifiez les input parameters en fonction de la fonction que vous souhaitez créer.
RemarqueLe paramètre command n'est pas pris en charge pour les hooks PreStop.
Développez instanceLifecycleConfig. Dans la section initializer, définissez timeout sur
300. Dans la liste command, ajoutez un élément à l'index 0 avec la valeurcurl -X POST 'http://localhost:9000/preWarm'. Dans la section preStop, définissez handler surindex.preStopet timeout sur3. Après avoir configuré les paramètres, cliquez sur l'onglet SDK Example pour obtenir l'exemple de code correspondant à votre langage préféré.
Pour savoir comment implémenter les hooks de cycle de vie d'instance pour différents runtimes, consultez Hooks de cycle de vie pour les instances de fonction.
Hooks de cycle de vie pour les instances de fonction
Tous les runtimes dans Function Compute prennent en charge les hooks Initializer et PreStop. Reportez-vous à la documentation suivante pour savoir comment implémenter les hooks de cycle de vie d'instance dans différents runtimes.
|
Runtime |
Description |
Références |
|
Node.js |
Implémenter des hooks de cycle de vie pour les instances de fonction en Node.js. |
|
|
Python |
Implémenter des hooks de cycle de vie pour les instances de fonction en Python. |
|
|
PHP |
Implémenter des hooks de cycle de vie pour les instances de fonction en PHP. |
|
|
Java |
Implémenter des hooks de cycle de vie pour les instances de fonction en Java. |
|
|
C# |
Implémenter des hooks de cycle de vie pour les instances de fonction en C#. |
|
|
Go |
Implémenter des hooks de cycle de vie pour les instances de fonction en Go. |
|
|
custom runtime |
Implémenter des hooks de cycle de vie pour les instances de fonction dans un custom runtime. |
|
|
custom container runtime |
Implémenter des hooks de cycle de vie pour les instances de fonction dans un custom container runtime. |
Interroger les journaux liés aux hooks
Après avoir configuré les hooks de cycle de vie d'instance et implémenté les fonctions correspondantes, interrogez les journaux associés.
Les journaux générés par les hooks de type Command Execution ne peuvent actuellement pas être écrits dans les journaux de fonction.
Connectez-vous à la console Function Compute. Dans le volet de navigation de gauche, choisissez .
Dans la barre de navigation supérieure, sélectionnez une région. Sur la page Functions, cliquez sur la fonction cible.
-
Sur la page de détails de la fonction, cliquez sur l'onglet Logs. Dans l'onglet Invocation Requests, localisez la requête cible et cliquez sur Advanced Logs dans la colonne Actions.
Utilisez l'ID d'instance pour interroger les journaux de début et de fin de tous les hooks de cycle de vie. Vous pouvez également utiliser une requête telle que
instance ID AND "hook keyword"pour trouver les journaux d'un hook spécifique, par exemplec-62833f38-20f1629801fa4bd***** and PreStop.Vous pouvez aussi utiliser le RequestId des journaux de début et de fin pour interroger les journaux liés à une requête spécifique. Si un journal ne contient pas de RequestId, cliquez sur l'icône
dans cette entrée de journal pour afficher ses journaux contextuels.