As instâncias de função passam por etapas de inicialização e limpeza que o código do handler não controla. Os hooks de ciclo de vida permitem associar lógica personalizada a esses momentos: execute código de configuração antes da primeira invocação e código de limpeza antes da destruição da instância. Este tópico aborda os hooks de ciclo de vida para o runtime Go.
Como funciona
Toda instância de função passa por três fases:
|
Fase |
O que acontece |
|
Init |
A instância inicia. Se houver um hook Initializer configurado, ele executa antes da primeira invocação do handler. |
|
Invoke |
A instância processa requisições. |
|
Shutdown |
A instância é destruída. Se houver um hook PreStop configurado, ele executa antes da destruição. |
O faturamento dos hooks de ciclo de vida segue as mesmas regras das invocações regulares.
Hook Initializer
Executa exatamente uma vez durante o tempo de vida da instância, após a inicialização e antes da primeira invocação do handler.
Se o hook falhar, o Function Compute tentará executá-lo novamente até obter sucesso. O handler só inicia após a conclusão bem-sucedida do Initializer.
Projete seu Initializer para ser idempotente e garantir segurança em novas tentativas.
Casos de uso comuns: carregar configurações de variáveis de ambiente, criar pools de conexões com banco de dados e aquecer caches.
Hook PreStop
Executa antes da destruição da instância.
Para usar o hook PreStop, atualize o fc-runtime-go-sdk para a versão v0.1.0 ou superior.
Pré-requisitos
Antes de começar, verifique se você tem:
Uma função do Function Compute com o runtime Go
fc-runtime-go-sdk v0.1.0 ou posterior (necessário para o hook PreStop)
Implementar hooks de ciclo de vida
Ambos os hooks compartilham a mesma assinatura: um único parâmetro ctx context.Context sem valor de retorno:
func(ctx context.Context)
Registre os hooks na função main() antes de chamar fc.Start() ou fc.StartHttp(). Registros feitos após fc.Start() são ignorados.
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)
}
Funções principais:
|
Função |
Descrição |
|
|
Hook Initializer. O parâmetro |
|
|
Hook PreStop. O parâmetro |
|
|
Ponto de entrada para funções em Go. Chame |
Registre todos os hooks antes de chamar fc.Start(HandleRequest) ou fc.StartHttp(HandleRequest). Hooks registrados após essa chamada não são reconhecidos.
Configure hooks de ciclo de vida
Usar o console do Function Compute
No console do Function Compute, abra a configuração da sua função e defina os campos Initializer hook e PreStop hook.

Para obter a referência completa de configuração, consulte Configure instance lifecycles.
Usar o Serverless Devs
Adicione os campos initializer e instanceLifecycleConfig.preStop à seção props do arquivo s.yaml.
O campo handler deve ser uma string não vazia. Ao usar o valor padrão "true", envolva-o entre aspas duplas no arquivo 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
Para consultar a referência completa de yaml do Serverless Devs, visualize Common commands of Serverless Devs.
Visualize logs de hooks de ciclo de vida
Os logs dos hooks de ciclo de vida aparecem em Function Logs, Real-time Logs e Advanced Logs. Eles não aparecem na lista de requisições de invocação.
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 a função desejada.
Clique em a aba Test Function, clique em Test Function e escolha Logs > Function Logs.
A aba Logs exibe os logs de invocação e do Initializer juntos. Exemplo:
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
Como as instâncias de função ficam em cache e não são destruídas imediatamente, os logs do PreStop não aparecem instantaneamente. Para acionar um hook PreStop imediatamente, atualize o código ou a configuração da função. Isso força o encerramento da instância existente. 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
Programa de exemplo
O exemplo go-initializer-mysql demonstra como usar o hook Initializer para configurar um pool de conexões MySQL em Go:
Leia as configurações de conexão do MySQL nas variáveis de ambiente da função (definidas em
s.yaml).Crie um pool de conexões no hook Initializer.
Teste a conectividade antes da execução do handler.
Esse padrão mantém a configuração de conexão fora do caminho crítico, permitindo que cada invocação reutilize um pool já estabelecido.
Próximos passos
Configure instance lifecycles — referência completa das opções de configuração de ciclo de vida
Context — detalhes sobre o parâmetro
ctxdisponível em hooks e handlers