Todos os produtos
Search
Central de documentação

Function Compute:Métodos de hook do ciclo de vida da instância

Última atualização: Jun 29, 2026

Os hooks de ciclo de vida permitem executar lógica personalizada em dois momentos da existência de uma instância de função: após a inicialização (hook Initializer) e antes da destruição (hook PreStop). Este tópico explica como implementar e configurar ambos os hooks para funções Java.

Use hooks de ciclo de vida para diluir custos elevados de configuração entre múltiplas invocações:

  • Initializer hook: Obtenha credenciais de banco de dados de variáveis de ambiente e abra um pool de conexões apenas uma vez. As invocações subsequentes na mesma instância reutilizam a conexão, reduzindo latência e custos.

  • PreStop hook: Feche conexões com o banco de dados ou libere estados em memória antes que o sistema recicle a instância, evitando vazamento de recursos.

Para funções PHP, consulte Configurar ciclos de vida de instâncias.

Como funciona

O Function Compute executa cada instância em três etapas:

Etapa

Quando ocorre

O que é executado

Init

Na inicialização da instância, antes de qualquer invocação

Hook Initializer (uma vez)

Invoke

A cada solicitação

Seu handler

Shutdown

Imediatamente antes da destruição da instância

Hook PreStop

Comportamento do hook Initializer:

  • Executa exatamente uma vez durante o tempo de vida da instância, após o início e antes da primeira invocação do handler.

  • Se o hook Initializer falhar, o Function Compute tentará executá-lo novamente até obter sucesso e só então executará seu handler.

  • Torne o hook idempotente para lidar com retentativas de forma segura. Por exemplo, verifique se já existe um pool de conexões antes de criar um novo. Se o pool não for nulo, ignore a inicialização. Essa prática evita conexões duplicadas caso o hook seja reexecutado.

Comportamento do hook PreStop:

  • Executa antes da destruição da instância.

  • As instâncias permanecem em cache por um período antes da destruição; portanto, o PreStop não é acionado imediatamente após a última invocação.

Faturamento

A cobrança das execuções dos hooks de ciclo de vida segue o mesmo modelo das invocações regulares. Os logs de execução dos hooks aparecem em Function Logs, Real-time Logs e Advanced Logs, mas não constam na lista de solicitações de invocação.

Implementar os hooks

Hook Initializer

Implemente a interface FunctionInitializer e seu método initialize(Context context).

Definição da interface:

package com.aliyun.fc.runtime;

import java.io.IOException;

/**
 * This is the interface for the initialization operation
 */
public interface FunctionInitializer {

    /**
     * The interface to handle a function compute initialize request
     *
     * @param context The function compute initialize environment context object.
     * @throws IOException IOException during I/O handling
     */
    void initialize(Context context) throws IOException;
}

Hook PreStop

Implemente a interface PreStopHandler e seu método preStop(Context context).

Definição da interface:

package com.aliyun.fc.runtime;

import java.io.IOException;

/**
 * This is the interface for the preStop operation
 */
public interface PreStopHandler {

    /**
     * The interface to handle a function compute preStop request
     *
     * @param context The function compute preStop environment context object.
     * @throws IOException IOException during I/O handling
     */
    void preStop(Context context) throws IOException;
}

Exemplo completo: StreamRequestHandler com ambos os hooks

package example;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import com.aliyun.fc.runtime.Context;
import com.aliyun.fc.runtime.StreamRequestHandler;
import com.aliyun.fc.runtime.FunctionInitializer;
import com.aliyun.fc.runtime.PreStopHandler;

public class App implements StreamRequestHandler, FunctionInitializer, PreStopHandler {
    @Override
    public void initialize(Context context) throws IOException {
        context.getLogger().info("initialize start ...");
    }

    @Override
    public void handleRequest(
            InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
        context.getLogger().info("handlerRequest ...");
        outputStream.write(new String("hello world\n").getBytes());
    }

    @Override
    public void preStop(Context context) throws IOException {
        context.getLogger().info("preStop start ...");
    }
}
Nota: O InputStream retorna dados em blocos. O OutputStream não opera dessa forma.

Configurar hooks de ciclo de vida

Usar o console do Function Compute

Na página de detalhes da função no console do Function Compute, defina os campos de hook com o formato [Nome do pacote].[Nome da classe]::[Nome do método].

db_java_lifecycle

Para a classe de exemplo acima:

  • Initializer Hook: example.App::initialize

  • PreStop Hook: example.App::preStop

Usar o Serverless Devs

Adicione instanceLifecycleConfig abaixo de function no arquivo s.yaml, incluindo as subchaves initializer e preStop. Cada subchave exige um handler e um timeout (em segundos).

# ------------------------------------
#   Official manual: https://manual.serverless-devs.com/user-guide/aliyun/#fc3
#   Tips: https://manual.serverless-devs.com/user-guide/tips/
# If you have any questions, join the DingTalk group 33947367 for technical support.
# ------------------------------------
edition: 3.0.0
name: hello-world-app
access: "default"

vars: # The global variables
  region: "cn-hangzhou"

resources:
  hello_world:
    component: fc3
    actions:
      pre-${regex('deploy|local')}:
        - run: mvn package -DskipTests
          path: ./
    props:
      region: ${vars.region}
      functionName: "start-java-1xqf"
      description: 'hello world by serverless devs'
      runtime: "java8"
      code: ./target/HelloFCJava-1.0-SNAPSHOT-jar-with-dependencies.jar
      handler: example.App::handleRequest
      memorySize: 128
      timeout: 10
      instanceLifecycleConfig:      # The extension function
        initializer:                # The Initializer hook
          handler: example.App::initialize
          timeout: 60
        preStop:                    # The PreStop hook
          handler: example.App::preStop  # The function handler
          timeout: 60               # The timeout period.

Para consultar a referência completa da sintaxe YAML, visualize Comandos comuns do Serverless Devs.

Visualizar logs dos hooks de ciclo de vida

Os logs dos hooks aparecem junto aos logs de invocação em Function Logs, mas não constam na lista de solicitaçõ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 Functions e escolha a função desejada.

  3. Na página de detalhes da função, clique em Test Function, clique em Test Function e escolha Logs > Function Logs.

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

Logs do PreStop — acionando o hook:

As instâncias permanecem em cache por um período antes da destruição; portanto, os logs do PreStop não aparecem imediatamente. Para acionar o PreStop instantaneamente, atualize a configuração ou o código da função. Após a atualização, os logs do PreStop estarão disponíveis 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

Próximos passos

  • java11-mysql: Programa de exemplo que usa um hook Initializer para obter configurações de banco de dados de variáveis de ambiente e abrir uma conexão MySQL, além de um hook PreStop para fechá-la.