All Products
Search
Document Center

Function Compute:Metode kait siklus hidup instans

Last Updated:Apr 02, 2026

Kait siklus hidup memungkinkan Anda menjalankan logika kustom pada dua titik dalam masa aktif instans fungsi: setelah instans dimulai (kait Initializer) dan sebelum dihapus (kait PreStop). Halaman ini menjelaskan cara mengimplementasikan dan mengonfigurasi kedua kait tersebut untuk fungsi Java.

Gunakan kait siklus hidup untuk mendistribusikan biaya setup mahal secara merata di beberapa invokasi:

  • Initializer hook: Ambil kredensial database dari variabel lingkungan dan buka kolam koneksi sekali saja. Semua invokasi berikutnya pada instans yang sama menggunakan kembali koneksi tersebut, sehingga mengurangi latensi dan biaya.

  • PreStop hook: Tutup koneksi database atau flush status dalam memori sebelum instans didaur ulang untuk mencegah kebocoran sumber daya.

Untuk fungsi PHP, lihat Konfigurasi siklus hidup instans.

Cara kerja

Function Compute menjalankan setiap instans melalui tiga tahap:

TahapKapanApa yang dijalankan
InitInstans dimulai, sebelum invokasi pertamaKait Initializer (sekali)
InvokeSetiap permintaanPenangan Anda
ShutdownInstans akan dihapusKait PreStop

Perilaku kait Initializer:

  • Dijalankan tepat satu kali selama masa aktif instans, setelah instans dimulai dan sebelum invokasi penanganan pertama.

  • Jika kait Initializer gagal, Function Compute akan mencoba ulang hingga berhasil, lalu menjalankan penanganan Anda.

  • Buat kait bersifat idempoten agar aman saat dicoba ulang. Misalnya, periksa apakah kolam koneksi sudah ada sebelum membuat yang baru — jika kolam tidak null, lewati inisialisasi. Ini mencegah koneksi duplikat jika kait dicoba ulang.

Perilaku kait PreStop:

  • Dijalankan sebelum instans dihapus.

  • Instans di-cache selama periode tertentu sebelum penghapusan, sehingga PreStop tidak dijalankan segera setelah invokasi terakhir.

Tagihan

Eksekusi kait siklus hidup dikenai biaya seperti invokasi biasa. Log eksekusi kait muncul di Function Logs, Real-time Logs, dan Advanced Logs, tetapi tidak muncul dalam daftar permintaan invokasi.

Implementasikan kait

Kait Initializer

Implementasikan antarmuka FunctionInitializer dan metode initialize(Context context)-nya.

Definisi antarmuka:

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;
}

Kait PreStop

Implementasikan antarmuka PreStopHandler dan metode preStop(Context context)-nya.

Definisi antarmuka:

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;
}

Contoh lengkap: StreamRequestHandler dengan kedua kait

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 ...");
    }
}
Catatan: InputStream mengembalikan data dalam chunk. OutputStream tidak.

Konfigurasi kait siklus hidup

Gunakan Konsol Function Compute

Pada halaman detail fungsi di Konsol Function Compute, atur bidang kait menggunakan format [Nama paket].[Nama kelas]::[Nama metode].

db_java_lifecycle

Untuk kelas contoh di atas:

  • Initializer Hook: example.App::initialize

  • PreStop Hook: example.App::preStop

Gunakan Serverless Devs

Tambahkan instanceLifecycleConfig di bawah function dalam s.yaml, dengan sub-kunci initializer dan preStop. Setiap sub-kunci menerima handler dan timeout (dalam detik).

# ------------------------------------
#   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.

Untuk referensi sintaksis YAML lengkap, lihat Perintah umum Serverless Devs.

Lihat log kait siklus hidup

Log kait muncul bersama log invokasi di Function Logs tetapi tidak tercantum dalam daftar permintaan invokasi.

  1. Masuk ke Konsol Function Compute. Di panel navigasi kiri, klik Functions.

  2. Di bilah navigasi atas, pilih wilayah. Pada halaman Functions, klik fungsi yang ingin Anda kelola.

  3. Pada halaman detail fungsi, klik tab Test Function, klik Test Function, lalu pilih Logs > Function Logs.

Log 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

Log PreStop — memicu kait:

Instans fungsi di-cache selama periode tertentu sebelum penghapusan, sehingga log PreStop tidak muncul segera. Untuk memicu PreStop segera, perbarui konfigurasi atau kode fungsi. Setelah pembaruan, log PreStop muncul di 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

Langkah berikutnya

  • java11-mysql: Program contoh yang menggunakan kait Initializer untuk mengambil konfigurasi database dari variabel lingkungan dan membuka koneksi MySQL, serta kait PreStop untuk menutupnya.