Todos os produtos
Search
Central de documentação

Function Compute:Hooks de ciclo de vida para instâncias de função

Última atualização: Jun 29, 2026

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.

Importante

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

initialize(ctx context.Context)

Hook Initializer. O parâmetro ctx contém o contexto da invocação. Consulte Context.

preStop(ctx context.Context)

Hook PreStop. O parâmetro ctx contém o contexto da invocação. Consulte Context.

main()

Ponto de entrada para funções em Go. Chame fc.RegisterInitializerFunction e fc.RegisterPreStopFunction nesta função antes de passar o handler para fc.Start.

Importante

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.

db-go-lifecycle

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.

Importante

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.

  1. Faça login no console do Function Compute. No painel de navegação à esquerda, clique em Functions.

  2. Na barra de navegação superior, selecione uma região. Na página Functions, clique em a função desejada.

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

  1. Leia as configurações de conexão do MySQL nas variáveis de ambiente da função (definidas em s.yaml).

  2. Crie um pool de conexões no hook Initializer.

  3. 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 ctx disponível em hooks e handlers