Function Compute, belirli örnek olayları gerçekleştiğinde yaşam döngüsü kancalarını çağırarak işleyicinizin dışında kurulum ve temizleme kodu çalıştırmanıza olanak tanır. C# çalışma zamanı iki kanca destekler: Initializer ve PreStop. Örnek yaşam döngüsü yönetimi hakkında arka plan bilgisi için bkz. Örnek yaşam döngülerini yapılandırma.
Yaşam döngüsü kancaları, standart işlev çağırmalarıyla aynı şekilde faturalandırılır. Kanca çalıştırma günlükleri Function Logs , Real-time Logs ve Advanced Logs bölümlerinde görünür ancak çağrı istek listesinde yer almaz.
Initializer ve PreStop nasıl çalışır?
Initializer
Initializer kancası, bir işlev örneği başladıktan sonra ancak ilk işleyici çağrısından önce çalışır. Function Compute, bu kancanın örnek yaşam süresi boyunca tam olarak bir kez çalışmasını garanti eder.
Initializer kancası başarısız olursa çağrı bir hata döndürür. Sonraki çağrıda Function Compute yeni bir örnek oluşturur ve Initializer kancasını yeniden dener.
Initializer kancasını tek seferlik kurulumlar için kullanın; örneğin SDK istemcilerini veya veritabanı bağlantılarını başlatmak amacıyla. Function Compute sıcak örnekleri çağrılar arasında yeniden kullandığından, Initializer kancasındaki kurulum kodu yalnızca bir kez çalışır ve sonuçları o örnek üzerindeki sonraki tüm işleyici çağrıları için kullanılabilir hale gelir.
PreStop
PreStop kancası, bir işlev örneği yok edilmeden önce çalışır. Örnek kapatılmadan önce arabellekleri boşaltmak, bağlantıları kapatmak veya kaynakları serbest bırakmak için bu kancayı kullanın.
Yöntem imzası
Hem Initializer hem de PreStop kancaları aynı yöntem imzasını kullanır: Bir adet IFcContext giriş parametresi ve dönüş değeri yoktur.
Örnek yöntemi:
public void FunctionName(IFcContext context);
Statik yöntem:
public static void FunctionName(IFcContext context);
Örnek
Aşağıdaki örnek, bir akış işleyicisinin yanı sıra her iki kancayı da uygulayan bir sınıfı göstermektedir.
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 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){}
}
}
Yaşam döngüsü kancalarını yapılandırma
Function Compute konsolunu kullanma
Function Compute konsolunda, kancaları bir işleyiciyle aynı biçimi kullanarak yapılandırın: Bütünleştirilmiş kod adı::Ad Alanı.Sınıf adı::Yöntem adı. Ayrıntılar için bkz. Örnek yaşam döngülerini yapılandırma ve İşleyiciler.
Yukarıdaki örnek sınıfa göre:
Initializer:
HelloFcApp::Example.Hello::InitializePreStop:
HelloFcApp::Example.Hello::PreStop
Serverless Devs kullanma
s.yaml dosyanızdaki function bloğuna instanceLifecycleConfig ekleyin. Her kanca bir handler ve bir timeout alanı gerektirir.
edition: 3.0.0
name: hello-world-app
access: "default"
vars:
region: "cn-hangzhou"
resources:
hello_world:
component: fc3
actions:
pre-${regex('deploy|local')}:
- run: dotnet publish -c Release -o ./target
path: ./HelloWorldApp
props:
region: ${vars.region}
functionName: "start-dotnetcore-p6jp"
description: 'hello world by serverless devs'
runtime: "dotnetcore3.1"
code: ./HelloWorldApp/target/
handler: HelloWorldApp::Example.Hello::StreamHandler
memorySize: 128
timeout: 10
instanceLifecycleConfig:
initializer:
handler: HelloFcApp::Example.Hello::Initialize
timeout: 60
preStop:
handler: HelloFcApp::Example.Hello::PreStop
timeout: 60
YAML sözdizimi ayrıntıları için bkz. Serverless Devs genel komutları.
Yaşam döngüsü kancası günlüklerini görüntüleme
Function Compute konsolunda oturum açın. Sol gezinme bölmesinde Functions seçeneğine tıklayın.
Üst gezinme çubuğundan bir bölge seçin. Functions sayfasında incelemek istediğiniz işleve tıklayın.
İşlev ayrıntıları sayfasında Test Function sekmesine tıklayın, Test Function seçeneğine tıklayın ve ardından Logs > Function Logs yolunu izleyin.
Logs sekmesi hem çağrı günlüklerini hem de Initializer günlüklerini gösterir:
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
İşlev örnekleri çağrıdan sonra önbelleğe alınır ve hemen yok edilmez, bu nedenle PreStop günlükleri hemen görünmez. Bir PreStop kancasını hemen tetiklemek için işlev yapılandırmasını veya kodunu güncelleyin; bu işlem mevcut örneklerin değiştirilmesini zorlar. Güncellemeden sonra PreStop günlükleri Function Logs bölümünde görünür:
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