O Function Compute aciona hooks de ciclo de vida quando eventos específicos da instância ocorrem, permitindo que você execute códigos de configuração e limpeza fora do seu handler. O runtime C# oferece suporte a dois hooks: Initializer e PreStop. Para obter informações básicas sobre o gerenciamento do ciclo de vida da instância, consulte Configurar ciclos de vida de instâncias.
Os hooks de ciclo de vida são faturados da mesma forma que as invocações de função padrão. Os logs de execução dos hooks aparecem em Function Logs , Real-time Logs e Advanced Logs , mas não na lista de solicitações de invocação.
Como funcionam os hooks Initializer e PreStop
Initializer
O hook Initializer é executado após o início de uma instância de função e antes da primeira invocação do handler. O Function Compute garante que ele seja executado exatamente uma vez durante o tempo de vida da instância.
Se o hook Initializer falhar, a invocação retornará um erro. Na próxima invocação, o Function Compute cria uma nova instância e tenta executar o hook Initializer novamente.
Utilize o hook Initializer para configurações únicas, como inicializar clientes SDK ou conexões de banco de dados. Como o Function Compute reutiliza instâncias aquecidas entre invocações, o código de configuração no hook Initializer é executado apenas uma vez, e seus resultados ficam disponíveis para todas as chamadas subsequentes do handler nessa instância.
PreStop
O hook PreStop é executado antes que uma instância de função seja destruída. Use-o para liberar buffers, fechar conexões ou liberar recursos antes do desligamento da instância.
Assinatura do método
Os hooks Initializer e PreStop utilizam a mesma assinatura de método: um parâmetro de entrada IFcContext e nenhum valor de retorno.
Método de instância:
public void FunctionName(IFcContext context);
Método estático:
public static void FunctionName(IFcContext context);
Exemplo
O exemplo a seguir mostra uma classe que implementa ambos os hooks juntamente com um 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){}
}
}
Configure hooks de ciclo de vida
Usar o console do Function Compute
No console do Function Compute, configure os hooks usando o mesmo formato de um handler: Assembly name::Namespace.Class name::Method name. Para mais detalhes, consulte Configurar ciclos de vida de instâncias e Handlers.
Com base na classe de exemplo acima:
Initializer:
HelloFcApp::Example.Hello::InitializePreStop:
HelloFcApp::Example.Hello::PreStop
Usar o Serverless Devs
Adicione instanceLifecycleConfig ao bloco function no seu arquivo s.yaml. Cada hook requer um campo handler e um campo 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
Para detalhes sobre a sintaxe YAML, consulte Comandos comuns do Serverless Devs.
Visualize logs de hooks de ciclo de vida
Faça login no console do Function Compute. No painel de navegação à esquerda, clique em Functions.
Na barra de navegação superior, selecione uma região. Na página Functions, clique em na função que deseja inspecionar.
Na página de detalhes da função, clique em na aba Test Function, clique em Test Function e, em seguida, escolha Logs > Function Logs.
A aba Logs exibe tanto os logs de invocação quanto os logs do 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
As instâncias de função permanecem em cache após a invocação e não são destruídas imediatamente, portanto, os logs do PreStop não aparecem de imediato. Para acionar um hook PreStop imediatamente, atualize a configuração ou o código da função — isso força a substituição das instâncias existentes. Após a atualização, os logs do PreStop aparecem em 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