Function Compute appelle les hooks de cycle de vie lors d'événements spécifiques de l'instance. Vous pouvez ainsi exécuter du code d'initialisation et de nettoyage en dehors du handler. Le runtime C# prend en charge deux hooks : Initializer et PreStop. Pour plus d'informations sur la gestion du cycle de vie des instances, consultez Configurer le cycle de vie des instances.
Les hooks de cycle de vie sont facturés comme les invocations de fonction standard. Leurs journaux d'exécution apparaissent dans Function Logs , Real-time Logs et Advanced Logs , mais pas dans la liste des requêtes d'invocation.
Fonctionnement des hooks Initializer et PreStop
Initializer
Le hook Initializer s'exécute après le démarrage d'une instance de fonction, avant la première invocation du handler. Function Compute garantit une exécution unique durant la durée de vie de l'instance.
Si le hook Initializer échoue, l'invocation renvoie une erreur. Lors de l'invocation suivante, Function Compute crée une nouvelle instance et relance le hook Initializer.
Utilisez le hook Initializer pour les configurations uniques, telles que l'initialisation de clients SDK ou de connexions à une base de données. Function Compute réutilisant les instances chaudes entre les invocations, le code de configuration du hook Initializer ne s'exécute qu'une fois. Ses résultats restent disponibles pour tous les appels de handler ultérieurs sur cette même instance.
PreStop
Le hook PreStop s'exécute avant la destruction d'une instance de fonction. Utilisez-le pour vider les mémoires tampons, fermer les connexions ou libérer des ressources avant l'arrêt de l'instance.
Signature de méthode
Les hooks Initializer et PreStop partagent la même signature de méthode : un paramètre d'entrée IFcContext et aucune valeur de retour.
Méthode d'instance :
public void FunctionName(IFcContext context);
Méthode statique :
public static void FunctionName(IFcContext context);
Exemple
L'exemple suivant présente une classe implémentant les deux hooks ainsi qu'un stream handler.
using System;
using System.IO;
using System.Threading.Tasks;
using Aliyun.Serverless.Core;
using Microsoft.Extensions.Logging;
namespace Example
{
public class Hello
{
public void Initialize(IFcContext context)
{
IFcLogger logger = context.Logger;
logger.LogInformation("Initialize start");
logger.LogInformation("Handle initializer: {0}", context.RequestId);
logger.LogInformation("Initialize end");
}
public void PreStop(IFcContext context)
{
IFcLogger logger = context.Logger;
logger.LogInformation("PreStop start");
logger.LogInformation("Handle PreStop: {0}", context.RequestId);
logger.LogInformation("PreStop end");
}
public async Task<Stream> StreamHandler(Stream input, IFcContext context)
{
IFcLogger logger = context.Logger;
logger.LogInformation("Handle request: {0}", context.RequestId);
MemoryStream copy = new MemoryStream();
await input.CopyToAsync(copy);
copy.Seek(0, SeekOrigin.Begin);
return copy;
}
static void Main(string[] args){}
}
}
Configurer les hooks de cycle de vie
Via la console Function Compute
Dans la console Function Compute, configurez les hooks selon le même format que pour un handler : Assembly name::Namespace.Class name::Method name. Pour plus de détails, consultez Configurer le cycle de vie des instances et Handlers.
D'après la classe d'exemple ci-dessus :
Initializer :
HelloFcApp::Example.Hello::InitializePreStop :
HelloFcApp::Example.Hello::PreStop
Avec Serverless Devs
Ajoutez instanceLifecycleConfig au bloc function de votre fichier s.yaml. Chaque hook nécessite un champ handler et un champ timeout.
edition: 3.0.0
name: hello-world-app
access: "default"
vars:
region: "cn-hangzhou"
resources:
hello_world:
component: fc3
actions:
pre-${regex('deploy|local')}:
- run: dotnet publish -c Release -o ./target
path: ./HelloWorldApp
props:
region: ${vars.region}
functionName: "start-dotnetcore-p6jp"
description: 'hello world by serverless devs'
runtime: "dotnetcore3.1"
code: ./HelloWorldApp/target/
handler: HelloWorldApp::Example.Hello::StreamHandler
memorySize: 128
timeout: 10
instanceLifecycleConfig:
initializer:
handler: HelloFcApp::Example.Hello::Initialize
timeout: 60
preStop:
handler: HelloFcApp::Example.Hello::PreStop
timeout: 60
Pour plus d'informations sur la syntaxe YAML, consultez Commandes courantes de Serverless Devs.
Consulter les journaux des hooks de cycle de vie
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 à inspecter.
Sur la page de détails de la fonction, cliquez sur l'onglet Test Function, puis sur Test Function, et enfin choisissez Logs > Function Logs.
L'onglet Logs affiche les journaux d'invocation et ceux de l'Initializer :
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 après l'invocation et non détruites immédiatement, les journaux PreStop n'apparaissent pas tout de suite. Pour déclencher immédiatement un hook PreStop, mettez à jour la configuration ou le code de la fonction afin de forcer le remplacement des instances existantes. Après cette 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