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:
| Tahap | Kapan | Apa yang dijalankan |
|---|---|---|
| Init | Instans dimulai, sebelum invokasi pertama | Kait Initializer (sekali) |
| Invoke | Setiap permintaan | Penangan Anda |
| Shutdown | Instans akan dihapus | Kait 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:InputStreammengembalikan data dalam chunk.OutputStreamtidak.
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].

Untuk kelas contoh di atas:
Initializer Hook:
example.App::initializePreStop 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.
Masuk ke Konsol Function Compute. Di panel navigasi kiri, klik Functions.
Di bilah navigasi atas, pilih wilayah. Pada halaman Functions, klik fungsi yang ingin Anda kelola.
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-bf73bbb91b69Log 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-193c8b213031Langkah 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.