İşlev örnekleri, işleyici kodunuzun kontrol edemeyeceği başlatma ve temizleme süreçlerinde zaman harcar. Yaşam döngüsü kanca'ları, bu anlara özel mantık eklemenizi sağlar; ilk çağrıdan önce kurulum kodu çalıştırabilir ve örnek yok edilmeden önce temizlik kodu yürütebilirsiniz. Bu konu, Go çalışma zamanı için yaşam döngüsü kanca'larını kapsar.
Nasıl çalışır
Her işlev örneği üç aşamadan geçer:
| Aşama | Gerçekleşen işlem |
|---|---|
| Init | Örnek başlar. Bir Initializer kanca'sı yapılandırılmışsa, ilk işleyici çağrısından önce çalışır. |
| Invoke | Örnek istekleri işler. |
| Shutdown | Örnek yok edilir. Bir PreStop kanca'sı yapılandırılmışsa, yok etme işleminden önce çalışır. |
Yaşam döngüsü kanca'larının faturalandırması, normal çağrılarla aynı kurallara tabidir.
Initializer kanca'sı
Örneğin yaşam döngüsü boyunca tam olarak bir kez, örnek başladıktan sonra ancak ilk işleyici çağrısından önce çalışır.
Kanca başarısız olursa Function Compute başarılı olana kadar yeniden dener. Initializer başarıyla tamamlanana kadar işleyici çalışmaz.
Güvenle yeniden denenebilmesi için Initializer'ınızı idempotent olacak şekilde tasarlayın.
Yaygın kullanım senaryoları: ortam değişkenlerinden yapılandırma yükleme, veritabanı bağlantı havuzları oluşturma, önbellekleri ısıtma.
PreStop kanca'sı
Örnek yok edilmeden önce çalışır.
PreStop kanca'sını kullanmak için fc-runtime-go-sdk sürümünü v0.1.0 veya üzerine güncelleyin.
Ön koşullar
Başlamadan önce şunlara sahip olduğunuzdan emin olun:
Go çalışma zamanını kullanan bir Function Compute işlevi
fc-runtime-go-sdk v0.1.0 veya üzeri (PreStop kanca'sı için gereklidir)
Yaşam döngüsü kanca'larını uygulama
Her iki kanca da aynı imzayı paylaşır — tek bir ctx context.Context parametresi alır ve dönüş değeri yoktur:
func(ctx context.Context)
Kanca'ları main() içinde fc.Start() veya fc.StartHttp() çağrısından önce kaydedin. fc.Start() çağrısından sonra yapılan kayıtlar yoksayılır.
package main
import (
"context"
"log"
"github.com/aliyun/fc-runtime-go-sdk/fc"
"github.com/aliyun/fc-runtime-go-sdk/fccontext"
)
func HandleRequest(ctx context.Context) (string, error) {
return "hello world!", nil
}
func initialize(ctx context.Context) {
log.Print("this is initialize handler")
fctx, _ := fccontext.FromContext(ctx)
fctx.GetLogger().Infof("context: %#v\n", fctx)
}
func preStop(ctx context.Context) {
log.Print("this is preStop handler")
fctx, _ := fccontext.FromContext(ctx)
fctx.GetLogger().Infof("context: %#v\n", fctx)
}
func main() {
fc.RegisterInitializerFunction(initialize) // Register the Initializer hook
fc.RegisterPreStopFunction(preStop) // Register the PreStop hook
fc.Start(HandleRequest)
}
Temel işlevler:
| İşlev | Açıklama |
|---|---|
initialize(ctx context.Context) |
Initializer kanca'sı. ctx parametresi çağrı bağlamını taşır. Bkz. Context. |
preStop(ctx context.Context) |
PreStop kanca'sı. ctx parametresi çağrı bağlamını taşır. Bkz. Context. |
main() |
Go işlevlerinin giriş noktası. İşleyicinizi fc.Start öğesine aktarmadan önce burada fc.RegisterInitializerFunction ve fc.RegisterPreStopFunction çağrılarını yapın. |
Tüm kanca'ları fc.Start(HandleRequest) veya fc.StartHttp(HandleRequest) çağrısından önce kaydedin. Bu çağrıdan sonra kaydedilen kanca'lar tanınmaz.
Yaşam döngüsü kanca'larını yapılandırma
Function Compute konsolunu kullanma
Function Compute konsolunda işlevinizin yapılandırmasını açın ve Initializer hook ile PreStop hook alanlarını ayarlayın.

Tam yapılandırma referansı için bkz. Örnek yaşam döngülerini yapılandırma.
Serverless Devs kullanma
s.yaml dosyanızın props bölümüne initializer ve instanceLifecycleConfig.preStop alanlarını ekleyin.
handler alanı boş olmayan bir dize olmalıdır. Varsayılan değer olan "true" kullanılırken, bunu s.yaml dosyasında çift tırnak içine alın.
edition: 3.0.0
name: hello-world # Project name
access: default # Key alias
vars: # Global variables
region: cn-hangzhou
resources:
helloworld: # Service or module name
component: fc3
props:
region: ${vars.region}
functionName: "golang-lifecycle-hook-demo"
description: 'this is golang lifecycle'
runtime: "go1"
code: ./
handler: main
memorySize: 128
timeout: 60
instanceLifecycleConfig:
initializer:
handler: initialize
timeout: 60
preStop:
handler: preStop # Function handler
timeout: 60 # Timeout in seconds
Tam Serverless Devs YAML referansı için bkz. Serverless Devs genel komutları.
Yaşam döngüsü kanca günlüklerini görüntüleme
Yaşam döngüsü kanca günlükleri Function Logs, Real-time Logs ve Advanced Logs bölümlerinde görünür. Çağrı isteği listesinde gösterilmezler.
Function Compute konsoluna 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 yönetmek istediğiniz işleve tıklayın.
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 birlikte gösterir. Örnek:
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 önbelleğe alınır ve hemen yok edilmez, bu nedenle PreStop günlükleri hemen görünmeyebilir. Bir PreStop kanca'sını hemen tetiklemek için işlevin kodunu veya yapılandırmasını güncelleyin; bu işlem mevcut örneğin kapatılmasını 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
Örnek program
go-initializer-mysql örneği, Go'da MySQL bağlantı havuzu kurmak için Initializer kanca'sının nasıl kullanılacağını gösterir:
MySQL bağlantı ayarlarını işlev ortam değişkenlerinden okuyun (
s.yamldosyasında tanımlanır).Initializer kanca'sında bir bağlantı havuzu oluşturun.
İşleyici çalışmadan önce bağlantıyı test edin.
Bu yaklaşım, bağlantı kurulumunu kritik yoldan çıkararak her çağrının zaten kurulmuş bir havuzu yeniden kullanmasını sağlar.
Sırada ne var
Örnek yaşam döngülerini yapılandırma — yaşam döngüsü yapılandırma seçenekleri için tam referans
Context — kanca'larda ve işleyicilerde bulunan
ctxparametresi hakkında ayrıntılar