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.
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. |
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.

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.
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.
Connectez-vous à la console Function Compute. Dans le volet de navigation de gauche, cliquez sur Functions.
Dans la barre de navigation supérieure, sélectionnez une région. Sur la page Functions, cliquez sur la fonction à gérer.
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 :
Lire les paramètres de connexion MySQL depuis les variables d'environnement de la fonction (définies dans
s.yaml).Créer un pool de connexions via le hook Initializer.
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
Configurer les cycles de vie des instances — Référence complète des options de configuration du cycle de vie
Context — Détails sur le paramètre
ctxdisponible dans les hooks et les handlers