Function Compute mendukung tiga kait siklus hidup untuk runtime C#: Initializer, PreFreeze, dan PreStop. Setiap kait dijalankan pada titik tertentu dalam siklus hidup instans fungsi, memungkinkan Anda menjalankan logika inisialisasi, menyimpan checkpoint status sebelum pembekuan, atau membersihkan sumber daya sebelum instans dihapus.
Urutan siklus hidup
Kait dijalankan dalam urutan berikut untuk setiap instans fungsi:
Initializer — dijalankan setelah instans dimulai, sebelum pemanggilan penanganan pertama
*(pemanggilan penanganan normal)*
PreFreeze — dijalankan sebelum instans memasuki status beku
PreStop — dijalankan sebelum instans dihapus
Untuk deskripsi lengkap mengenai siklus hidup instans, lihat Siklus hidup instans fungsi.
Penagihan
Eksekusi kait siklus hidup ditagih dengan cara yang sama seperti permintaan pemanggilan biasa. Log eksekusi muncul di Function Logs, Instance Logs, dan Advanced Logs, tetapi tidak muncul di Call Request List.
Signature metode
Ketiga kait tersebut memiliki signature metode yang sama dalam runtime C#: satu parameter input IFcContext context tanpa nilai kembali.
public void FunctionName(IFcContext context);Metode statis juga didukung:
public static void FunctionName(IFcContext context);Perilaku kait Initializer
Function Compute memastikan kait Initializer berhasil dieksekusi hanya sekali dalam siklus hidup instans fungsi.
Jika kait Initializer gagal, Function Compute mengembalikan error untuk pemanggilan tersebut. Saat Anda memanggil fungsi berikutnya, sistem akan membuat instans baru untuk mengeksekusi kait Initializer.
Contoh: StreamRequestHandler
Contoh berikut menunjukkan kelas yang mengimplementasikan ketiga kait siklus hidup bersamaan dengan penanganan aliran.
using System;
using System.IO;
using System.Threading.Tasks;
using Aliyun.Serverless.Core;
using Microsoft.Extensions.Logging;
namespace Example
{
public class Hello
{
public void Initialize(IFcContext context)
{
IFcLogger logger = context.Logger;
logger.LogInformation("Initialize start");
logger.LogInformation("Handle initializer: {0}", context.RequestId);
logger.LogInformation("Initialize end");
}
public void PreStop(IFcContext context)
{
IFcLogger logger = context.Logger;
logger.LogInformation("PreStop start");
logger.LogInformation("Handle PreStop: {0}", context.RequestId);
logger.LogInformation("PreStop end");
}
public void PreFreeze(IFcContext context)
{
IFcLogger logger = context.Logger;
logger.LogInformation("PreFreeze start");
logger.LogInformation("Handle PreFreeze: {0}", context.RequestId);
logger.LogInformation("PreFreeze end");
}
public async Task<Stream> StreamHandler(Stream input, IFcContext context)
{
IFcLogger logger = context.Logger;
logger.LogInformation("Handle request: {0}", context.RequestId);
MemoryStream copy = new MemoryStream();
await input.CopyToAsync(copy);
copy.Seek(0, SeekOrigin.Begin);
return copy;
}
static void Main(string[] args){}
}
}Konfigurasi kait siklus hidup
Gunakan Konsol Function Compute
Konfigurasikan kait siklus hidup pada halaman Function Details di Konsol Function Compute. Untuk detail navigasi, lihat Konfigurasi PreFreeze hook dan PreStop hook di Konsol Function Compute.
Format penanganan kait mengikuti konvensi yang sama seperti penanganan permintaan: Nama Assembly::Namespace.Nama Kelas::Nama Metode. Untuk detail selengkapnya, lihat Handler.
Contoh untuk kelas Hello dalam namespace Example, dikemas sebagai HelloFcApp:
| Hook | Nilai handler |
|---|---|
| Initializer | HelloFcApp::Example.Hello::Initialize |
| PreFreeze | HelloFcApp::Example.Hello::PreFreeze |
| PreStop | HelloFcApp::Example.Hello::PreStop |
Gunakan Serverless Devs
Tambahkan kait ke blok function dalam file s.yaml Anda:
| Hook | Bidang yang Akan Ditambahkan |
|---|---|
| Initializer | initializer, initializationTimeout |
| PreFreeze | instanceLifecycleConfig.preFreeze dengan Handler dan Timeout |
| PreStop | instanceLifecycleConfig.preStop dengan Handler dan Timeout |
edition: 1.0.0
name: hello-world
access: default
vars:
region: cn-shanghai
service:
name: fc-example
description: 'fc example by serverless devs'
services:
helloworld:
component: fc
actions:
pre-deploy:
- run: mvn package
path: ./
props:
region: ${vars.region}
service: ${vars.service}
function:
name: dotnet-lifecycle-hook-demo
description: 'fc example by serverless devs'
runtime: dotnetcore3.1
codeUri: ./target
handler: example.App::handleRequest
memorySize: 128
timeout: 60
initializer: HelloFcApp::Example.Hello::Initialize
initializationTimeout: 30
instanceLifecycleConfig:
preStop:
Handler: HelloFcApp::Example.Hello::PreStop
Timeout: 30
preFreeze:
Handler: HelloFcApp::Example.Hello::PreFreeze
Timeout: 30Untuk referensi sintaksis YAML lengkap, lihat Perintah Serverless Devs.
Lihat log kait siklus hidup
Masuk ke Konsol Function Compute. Di panel navigasi kiri, klik Services & Functions.
Di bilah navigasi atas, pilih wilayah. Pada halaman Services, klik layanan yang diinginkan.
Pada halaman Functions, klik nama fungsi. Di halaman Function Details, klik tab Test Function.
Klik Test Function, lalu pilih Logs > Function Logs.
Tab Function Logs menampilkan log pemanggilan bersama dengan log kait Initializer dan PreFreeze. Contoh:
2022-10-09 19:26:17 FunctionCompute dotnetcore3.1 runtime inited.
2022-10-09 19:26:17 FC Initialize Start RequestId: 793ad2f1-9826-4d9a-90d9-5bf39e******
2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] Initialize start
2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] Handle initializer: 793ad2f1-9826-4d9a-90d9-5bf39e******
2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] Initialize end
2022-10-09 19:26:17 FC Initialize End RequestId: 793ad2f1-9826-4d9a-90d9-5bf39e******
2022-10-09 19:26:17 FC Invoke Start RequestId: 793ad2f1-9826-4d9a-90d9-5bf39e******
2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] Handle request: 793ad2f1-9826-4d9a-90d9-5bf39e******
2022-10-09 19:26:17 FC Invoke End RequestId: 793ad2f1-9826-4d9a-90d9-5bf39e******
2022-10-09 19:26:17 FC PreFreeze Start RequestId: 793ad2f1-9826-4d9a-90d9-5bf39e******
2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] PreFreeze start
2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] Handle PreFreeze: 793ad2f1-9826-4d9a-90d9-5bf39e******
2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] PreFreeze end
2022-10-09 19:26:17 FC PreFreeze End RequestId: 793ad2f1-9826-4d9a-90d9-5bf39e******Log PreStop tidak muncul secara langsung karena Function Compute menyimpan cache instans untuk periode tertentu sebelum menghapusnya. Untuk memicu kait PreStop segera, perbarui konfigurasi atau kode fungsi. Setelah pembaruan, log PreStop akan muncul di Function Logs.
2022-10-09 19:32:17 FC PreStop Start RequestId: 03be685c-378b-4736-8b08-a67c1d*****
2022-10-09 19:32:17 2022-10-09 19:32:17 03be685c-378b-4736-8b08-a67c1d***** [INFO] PreStop start
2022-10-09 19:32:17 2022-10-09 19:32:17 03be685c-378b-4736-8b08-a67c1d***** [INFO] Handle PreStop: 03be685c-378b-4736-8b08-a67c1d*****
2022-10-09 19:32:17 2022-10-09 19:32:17 03be685c-378b-4736-8b08-a67c1d***** [INFO] PreStop end
2022-10-09 19:32:17 FC PreStop End RequestId: 03be685c-378b-4736-8b08-a67c1d*****