Function Compute, bir işlev örneğinin yaşamı boyunca belirli noktalarda yaşam döngüsü kancalarını çağırır; bu çağrılar örnek başlatıldığında bir kez ve kapatılmadan hemen önce bir kez gerçekleşir. Bu konuda, özel bir çalışma zamanında Initializer ve PreStop kancalarının nasıl uygulanacağı gösterilmektedir.
Nasıl çalışır?
Bir işlev örneği üç aşamadan geçer:
Başlatma: Function Compute bir örneği oluşturduğunda veya dondurulmuş durumdan çıkardığında, trafiği örneğe yönlendirmeden önce (yapılandırılmışsa) Initializer kancasını çağırır. İlk istekten önce tamamlanması gereken kurulum işlemlerini (model yükleme, bağlantı havuzlarını hazırlama vb.) yapmak için bu aşamayı kullanın.
Çalıştırma: Örnek, işlev çağrılarını işler. Ana işleyici, istekleri iş mantığınıza yönlendirir.
Kapatma: Function Compute bir örneği dondurmadan veya yok etmeden önce (yapılandırılmışsa) PreStop kancasını çağırır. Arabellekleri temizlemek, bağlantıları kapatmak veya kaynakları serbest bırakmak için bu aşamayı kullanın.
Yaşam döngüsü kancaları, normal çağrılarla aynı oranda faturalandırılır. Bu kancaların günlükleri Function Logs ve Advanced Logs bölümünde görüntülenir ancak Invocation Requests listesinde yer almaz.
Örnek yaşam döngüsü yapılandırması hakkında genel bilgi için bkz. Örnek yaşam döngüsünü yapılandırma.
Kanca arayüzü referansı
Özel çalışma zamanı HTTP sunucunuz aşağıdaki uç noktaları sunmalıdır:
| Kanca | Yol | Yöntem | İstek gövdesi | Başarı | Hata |
|---|---|---|---|---|---|
| Initializer | /initialize |
POST |
Yok | 2xx | 2xx dışı |
| PreStop | /pre-stop |
GET |
Yok | 2xx | 2xx dışı |
Her iki kanca da x-fc-request-id dahil olmak üzere ortak istek üst bilgilerini alır.
Initializer kancası zaman aşımına uğrar veya 2xx dışı bir durum kodu döndürürse sunucu yine de HTTP 200 yanıtı verir. Başlatma hatalarını tespit etmek için X-Fc-Error-Type:InitializationError yanıt üst bilgisini veya yanıt gövdesindeki errorMessage alanını kontrol edin.
Yaşam döngüsü kancalarını uygulayın
Aşağıdaki Python 3.10 Flask örneği, tek bir HTTP sunucusunda üç uç noktanın tümünü göstermektedir: Initializer kancası, ana çağrı işleyicisi ve PreStop kancası.
import os
from flask import Flask, request
app = Flask(__name__)
# Initializer hook — runs once when the instance starts
@app.route('/initialize', methods=['POST'])
def init_invoke():
rid = request.headers.get('x-fc-request-id')
print("FC Initialize Start RequestId: " + rid)
# Add setup logic here: load models, open connections, etc.
print("FC Initialize End RequestId: " + rid)
return "OK"
# Main invocation handler
@app.route('/', defaults={'path': ''})
@app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE'])
def hello_world(path):
rid = request.headers.get('x-fc-request-id')
print("FC invoke Start RequestId: " + rid)
# Add business logic here
print("FC invoke End RequestId: " + rid)
return "Hello, World!", 200, [('Function-Name', os.getenv('FC_FUNCTION_NAME'))]
# PreStop hook — runs before the instance is frozen or destroyed
@app.route('/pre-stop', methods=['GET'])
def prestop_invoke():
rid = request.headers.get('x-fc-request-id')
print("FC PreStop Start RequestId: " + rid)
# Add cleanup logic here: flush buffers, close connections, etc.
print("FC PreStop End RequestId: " + rid)
return "OK"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=9000)
İşlev için bir Initializer yapılandırdığınız takdirde yalnızca /initialize uç noktasını uygulayın. Initializer yapılandırılmamışsa, HTTP sunucunuzda bu uç nokta mevcut olsa bile Function Compute /initialize uç noktasını asla çağırmaz.
PreStop kancası, Initializer kancasıyla aynı uygulama desenini takip eder.
Initializer kancası için hata senaryoları
Başlatma mantığı bir özel durum oluşturur veya 2xx dışı bir durum kodu döndürürse Function Compute bir başlatma hatası kaydeder:
# Scenario 1: unhandled exception
@app.route('/initialize', methods=['POST'])
def init():
raise Exception("initialization failed")
return "OK", 200, []
# Scenario 2: explicit non-2xx response
@app.route('/initialize', methods=['POST'])
def init():
return "OK", 404, []
Hata yönetimi
Function Compute, hangi kancanın başarısız olduğuna ve döndürülen durum koduna bağlı olarak hatalara farklı şekilde yanıt verir.
Initializer hataları
| Durum kodu | Platform davranışı |
|---|---|
| 400, 404 | Function Compute mevcut isteği yeniden göndermez. Kancanın başarılı olana kadar Initializer kancasını yeniden dener. |
| 500 | Function Compute işlev örneğini yeniden başlatır. |
PreStop hataları
| Durum kodu | Platform davranışı |
|---|---|
| 400, 404 | Hata, örneğin dondurulmasını veya kapatılmasını etkilemez. Function Compute işlemi normal şekilde sürdürür. |
Yaşam döngüsü kancalarını yapılandırın
Function Compute konsoluna giriş yapın. Sol gezinme bölmesinde Functions seçeneğine tıklayın.
Üst gezinme çubuğunda bir bölge seçin. Functions sayfasında yapılandırmak istediğiniz işleve tıklayın.
Configuration sekmesine tıklayın. Instance Configuration bölümünde Modify seçeneğine tıklayın.
Instance Configuration panelinde kanca türünü ve zaman aşımı süresini ayarlayın, ardından Deploy seçeneğine tıklayın.
Kodunuzda kanca mantığını uygulayın. Kod düzenleyicisinin üzerindeki Deploy seçeneğine tıklayın, sonra Test Function seçeneğine tıklayın.
Yaşam döngüsü kancası günlüklerini görüntüleyin
Function Compute konsoluna giriş yapın. Sol gezinme bölmesinde Functions seçeneğine tıklayın.
Bir bölge seçin ve incelemek istediğiniz işleve tıklayın.
Test sekmesine tıklayın, Test Function seçeneğine tıklayın, ardından Logs > Function Logs yolunu izleyin.
Function Logs bölümü, çağrı günlüklerini ve Initializer kancası günlüklerini kronolojik sırayla gösterir. Aşağıdaki örnekte bir Initializer çalıştırmasının ardından bir işlev çağrısı görülmektedir:
2024-06-26 10:59:23FC Initialize Start RequestId: 529eab23-9b3a-4ffc-88c8-9a686*******
2024-06-26 10:59:23FC Initialize End RequestId: 529eab23-9b3a-4ffc-88c8-9a686*******
2024-06-26 10:59:25FC Invoke Start RequestId: 1-667b840c-15c49df0-b7dc1*******
2024-06-26 10:59:25FC Invoke End RequestId: 1-667b840c-15c49df0-b7dc1*******
Function Compute, örneği yok etmeden önce bir süre önbellekte tuttuğu için PreStop kancası günlükleri hemen görünmeyebilir. PreStop kancasını isteğe bağlı olarak tetiklemek için işlevin yapılandırmasını veya kodunu güncelleyin, ardından Function Logs bölümünü kontrol edin:
2024-06-26 11:04:33FC PreStop Start RequestId: c4385899-f071-490e-a8b7-e33c5*******
2024-06-26 11:04:33FC PreStop End RequestId: c4385899-f071-490e-a8b7-e33c5*******