Tous les produits
Search
Centre de documentation

Function Compute:Hooks du cycle de vie des instances de fonction

Dernière mise à jour :Aug 12, 2026

Les instances de fonction passent par des phases d'initialisation et de nettoyage indépendantes de votre code handler. Les hooks du cycle de vie vous permettent d'y associer une logique personnalisée : exécution d'un code de configuration avant la première invocation et d'un code de nettoyage avant la destruction de l'instance. Cette rubrique décrit les hooks du cycle de vie pour le runtime Go.

Fonctionnement

Chaque instance de fonction traverse trois phases :

Phase Description
Init Démarrage de l'instance. Si un hook Initializer est configuré, il s'exécute avant la première invocation du handler.
Invoke Traitement des requêtes par l'instance.
Shutdown Destruction de l'instance. Si un hook PreStop est configuré, il s'exécute avant cette destruction.

La facturation des hooks du cycle de vie suit les mêmes règles que celle des invocations classiques.

Hook Initializer

  • S'exécute une seule fois durant la durée de vie de l'instance, après son démarrage et avant la première invocation du handler.

  • En cas d'échec, Function Compute réessaie l'opération jusqu'à ce qu'elle réussisse. Le handler ne s'exécute pas tant que l'Initializer n'a pas abouti.

  • Concevez votre Initializer pour qu'il soit idempotent afin de garantir la sécurité des nouvelles tentatives.

Cas d'usage courants : chargement de la configuration depuis des variables d'environnement, création de pools de connexions à une base de données, préchauffage des caches.

Hook PreStop

  • S'exécute avant la destruction de l'instance.

Important

Pour utiliser le hook PreStop, mettez à jour fc-runtime-go-sdk vers la version v0.1.0 ou ultérieure.

Prérequis

Avant de commencer, assurez-vous de disposer des éléments suivants :

  • Une fonction Function Compute utilisant le runtime Go

  • fc-runtime-go-sdk v0.1.0 ou version ultérieure (requis pour le hook PreStop)

Mise en œuvre des hooks du cycle de vie

Les deux hooks partagent la même signature : un unique paramètre ctx context.Context sans valeur de retour :

func(ctx context.Context)

Enregistrez les hooks dans main() avant d'appeler fc.Start() ou fc.StartHttp(). Tout enregistrement effectué après fc.Start() est ignoré.

package main

import (
    "context"
    "log"

    "github.com/aliyun/fc-runtime-go-sdk/fc"
    "github.com/aliyun/fc-runtime-go-sdk/fccontext"
)

func HandleRequest(ctx context.Context) (string, error) {
    return "hello world!", nil
}

func initialize(ctx context.Context) {
    log.Print("this is initialize handler")
    fctx, _ := fccontext.FromContext(ctx)
    fctx.GetLogger().Infof("context: %#v\n", fctx)
}

func preStop(ctx context.Context) {
    log.Print("this is preStop handler")
    fctx, _ := fccontext.FromContext(ctx)
    fctx.GetLogger().Infof("context: %#v\n", fctx)
}

func main() {
    fc.RegisterInitializerFunction(initialize) // Register the Initializer hook
    fc.RegisterPreStopFunction(preStop)        // Register the PreStop hook
    fc.Start(HandleRequest)
}

Fonctions clés :

Fonction Description
initialize(ctx context.Context) Hook Initializer. Le paramètre ctx contient le contexte d'invocation. Consultez Context.
preStop(ctx context.Context) Hook PreStop. Le paramètre ctx contient le contexte d'invocation. Consultez Context.
main() Point d'entrée des fonctions Go. Appelez fc.RegisterInitializerFunction et fc.RegisterPreStopFunction ici avant de transmettre votre handler à fc.Start.
Important

Enregistrez tous les hooks avant d'appeler fc.Start(HandleRequest) ou fc.StartHttp(HandleRequest). Les hooks enregistrés après cet appel ne sont pas pris en compte.

Configuration des hooks du cycle de vie

Utilisation de la console Function Compute

Dans la console Function Compute, ouvrez la configuration de votre fonction et renseignez les champs Initializer hook et PreStop hook.

db-go-lifecycle

Pour consulter la référence complète de la configuration, reportez-vous à Configurer les cycles de vie des instances.

Utilisation de Serverless Devs

Ajoutez les champs initializer et instanceLifecycleConfig.preStop dans la section props de votre fichier s.yaml.

Important

Le champ handler doit être une chaîne non vide. Si vous utilisez la valeur par défaut "true", placez-la entre guillemets doubles dans le fichier s.yaml.

edition: 3.0.0
name: hello-world  # Project name
access: default    # Key alias

vars: # Global variables
  region: cn-hangzhou

resources:
  helloworld: # Service or module name
    component: fc3
    props:
      region: ${vars.region}
      functionName: "golang-lifecycle-hook-demo"
      description: 'this is golang lifecycle'
      runtime: "go1"
      code: ./
      handler: main
      memorySize: 128
      timeout: 60
      instanceLifecycleConfig:
        initializer:
          handler: initialize
          timeout: 60
        preStop:
          handler: preStop  # Function handler
          timeout: 60       # Timeout in seconds

Pour consulter la référence YAML complète de Serverless Devs, reportez-vous à Commandes courantes de Serverless Devs.

Consultation des journaux des hooks du cycle de vie

Les journaux des hooks du cycle de vie apparaissent dans les sections Function Logs, Real-time Logs et Advanced Logs. Ils ne figurent pas dans la liste des requêtes d'invocation.

  1. Connectez-vous à la console Function Compute. Dans le volet de navigation de gauche, cliquez sur Functions.

  2. Dans la barre de navigation supérieure, sélectionnez une région. Sur la page Functions, cliquez sur la fonction à gérer.

  3. Cliquez sur l'onglet Test Function, puis sur Test Function, et enfin choisissez Logs > Function Logs.

L'onglet Logs affiche conjointement les journaux d'invocation et ceux de l'Initializer. Exemple :

2024-03-04 17:57:28 FC Initialize Start RequestId: 1-65e59b07-1520da26-bf73bbb91b69
2024-03-04 17:57:28 2024-03-04 09:57:28.192 1-65e59b07-1520da26-bf73bbb91b69 [info] initializer
2024-03-04 17:57:28 FC Initialize End RequestId: 1-65e59b07-1520da26-bf73bbb91b69
2024-03-04 17:57:28 FC Invoke Start RequestId: 1-65e59b07-1520da26-bf73bbb91b69
2024-03-04 17:57:28 FC Invoke End RequestId: 1-65e59b07-1520da26-bf73bbb91b69

Les instances de fonction étant mises en cache et non détruites immédiatement, les journaux PreStop n'apparaissent pas instantanément. Pour déclencher un hook PreStop sans attendre, modifiez le code ou la configuration de la fonction afin de forcer l'arrêt de l'instance existante. Après la mise à jour, les journaux PreStop s'affichent dans Function Logs :

2024-03-04 18:33:26 FC PreStop Start RequestId: 93c93603-9fbe-4576-9458-193c8b213031
2024-03-04 18:33:26 2024-03-04 10:33:26.077 93c93603-9fbe-4576-9458-193c8b213031 [info] preStop
2024-03-04 18:33:26 FC PreStop End RequestId: 93c93603-9fbe-4576-9458-193c8b213031

Programme d'exemple

L'exemple go-initializer-mysql illustre l'utilisation du hook Initializer pour configurer un pool de connexions MySQL en Go :

  1. Lire les paramètres de connexion MySQL depuis les variables d'environnement de la fonction (définies dans s.yaml).

  2. Créer un pool de connexions via le hook Initializer.

  3. Tester la connectivité avant l'exécution du handler.

Ce modèle évite d'inclure l'établissement des connexions dans le chemin critique d'exécution, permettant ainsi à chaque invocation de réutiliser un pool déjà établi.

Étapes suivantes