Örnek yaşam döngüsü kancaları, bir işlev örneği başladığında veya durduğunda özel mantığınızı çalıştırır. Bu konuda, özel görüntüler kullanan işlevler için Initializer ve PreStop kancalarının nasıl uygulanacağı ve yapılandırılacağı açıklanmaktadır.
Arka plan bilgileri
Bir işlev örneğinin yaşam döngüsü Initializer ve PreStop kancalarını içerir. Function Compute, ilgili örnek yaşam döngüsü olayı gerçekleştiğinde karşılık gelen kancayı çağırır.
Initializer kancası iki türe sahiptir: invoke code ve execute instruction. Şu anda yalnızca GPU hızlandırmalı işlevler, execute instruction türündeki Initializer kancasını destekler. Daha fazla bilgi için bkz. Örnek yaşam döngüsünü yapılandırma.
Örnek yaşam döngüsü kancaları için faturalama kuralları, normal çağrı istekleriyle aynıdır.
Kanca günlükleri hakkında daha fazla bilgi için bkz. Örnek yaşam döngüsü kancası günlüklerini görüntüleme.
Kanca türleri
Initializer kancaları iki uygulama türünü destekler. Aşağıdaki tabloda bu türler karşılaştırılmaktadır.
|
|
|
|
|
|
|
|
|
|
|
|
Bir Initializer kancası için iki türden yalnızca birini yapılandırabilirsiniz.
Kancaları uygulama
Aşağıdaki bölümlerde her kanca türünün nasıl uygulanacağı açıklanmaktadır.
Kod çağırma (Invoke code)
Kod çağırma türünde bir kanca yapılandırdıktan sonra, bir işlev örneği başladığında veya durduğunda Function Compute işlevinize POST /initialize veya GET /pre-stop şeklinde bir HTTP isteği gönderir. İsteğe iş kodunuzla yanıt vermeniz gerekir.
Yol | İstek | Beklenen yanıt |
(İsteğe bağlı) POST | İstek gövdesi: Yoktur. İstek üstbilgileri: ortak istek üstbilgileri. Daha fazla bilgi için bkz. Function Compute ortak istek üstbilgileri. | Yanıt gövdesi: işlev Initializer tarafından döndürülen değer. Durum kodu: 2xx: başarı. 2xx dışı: başarısızlık. Bir Initializer kancası zaman aşımına uğradığında veya başarısız olduğunda, sunucu her zaman HTTP 200 durum kodunu döndürür. Hatanın başlatma hatasından kaynaklanıp kaynaklanmadığını belirlemek için |
(İsteğe bağlı) GET | İstek gövdesi: Yoktur. İstek üstbilgileri: ortak istek üstbilgileri. Daha fazla bilgi için bkz. Function Compute ortak istek üstbilgileri. | Yanıt gövdesi: işlev PreStop tarafından döndürülen değer.
|
Path sütunu (Optional) olarak işaretlenmiştir çünkü her kanca isteğe bağlı bir yapılandırmadır. Oluşturduğunuz işlev için bir Initializer ayarlamazsanız /initialize uygulamanıza gerek yoktur. Bu durumda, HTTP sunucunuz /initialize yolunu uygulasanız bile kodunuzdaki /initialize mantığı asla çağrılmaz. Aynı durum PreStop için de geçerlidir.
Özel bir görüntüde Initializer kanca yöntemini kullanmak için HTTP sunucunuzda POST yöntemiyle /initialize yoluna yönelik mantığı uygulayın. PreStop kanca yöntemi için de durum aynıdır. Aşağıdaki örnek program Python 3.10 özel çalışma zamanını kullanır.
import os
from flask import Flask
from flask import request
app = Flask(__name__)
@app.route('/initialize', methods=['POST'])
def init_invoke():
rid = request.headers.get('x-fc-request-id')
print("FC Initialize Start RequestId: " + rid)
# do your things
print("FC Initialize End RequestId: " + rid)
return "OK"
@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)
# do your things
print("FC invoke End RequestId: " + rid)
return "Hello, World!", 200, [('Function-Name', os.getenv('FC_FUNCTION_NAME'))]
@app.route('/pre-stop', methods=['GET'])
def prestop_invoke():
rid = request.headers.get('x-fc-request-id')
print("FC PreStop Start RequestId: " + rid)
# do your things
print("FC PreStop End RequestId: " + rid)
return "OK"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=9000)
Kanca kodunuz çalışma zamanında da başarısız olabilir. Aşağıdaki /initialize örneklerinde iki tipik başarısızlık durumu ve Function Compute'in bunlara nasıl yanıt verdiği gösterilmektedir. Her hata kodunun sistem davranışı için bkz. Kanca hata kodları.
Aşağıdaki örnekte işleyici bir özel durum oluşturur. Function Compute bu hatayı 500 hatası olarak değerlendirir ve örneği yeniden başlatır.
@app.route('/initialize', methods=['POST'])
def init():
raise Exception("hahaha")
return "OK", 200, []
Aşağıdaki örnekte işleyici 404 durum kodu döndürür. Function Compute isteği yeniden göndermez.
@app.route('/initialize', methods=['POST'])
def init():
return "OK", 404, []
Talimat yürütme (Yalnızca GPU hızlandırmalı işlevler)
Talimat yürütme türü yalnızca GPU hızlandırmalı işlevler için kullanılabilir.
Talimat yürütme türünde, Function Compute işlev örneği başladıktan sonra yapılandırdığınız kabuk komutunu veya betiğini çalıştırır. 0 çıkış kodu kanca talimatının başarıyla çalıştığını gösterir. Diğer tüm çıkış kodları başarısızlığı ifade eder.
/bin/bash, /bin/sh, /bin/csh veya /bin/zsh gibi özel bir kabuk uygulaması kullanabilirsiniz. Kullandığınız kabuk uygulamasının işlev çalışma zamanı ortamı tarafından desteklendiğinden emin olun.
Function Compute konsolu /bin/bash ve /bin/sh seçeneklerini önceden ayarlanmış olarak sunar. Aşağıdaki örnek /bin/sh kullanır. Betik bir başlatma sağlık denetimi gerçekleştirir: yerel bir hizmete istek göndermek için curl ve çıktıyı biçimlendirmek için jq kullanır. Her iki aracın da çalışma zamanı ortamınızda mevcut olduğundan emin olun.
#!/bin/sh
URL="http://localhost:7860"
REQUEST_PATH="sdapi/v1/txt2img"
JSON_DATA='{
"prompt": "",
"steps": 1,
"height": 8,
"width": 8
}'
temp_file=$(mktemp)
trap 'rm -f "$temp_file"' EXIT
if ! http_code=$(curl -s -w "%{http_code}" \
-H "Content-Type: application/json" \
-d "$JSON_DATA" \
-o "$temp_file" \
-X POST "$URL"/"$REQUEST_PATH"); then
echo "{\"status\": \"curl_error\", \"code\": $curl_exit_code}" \
| jq . >&2
exit 1
fi
response=$(<"$temp_file")
echo "http code $http_code"
if [ "$http_code" -eq 200 ]; then
echo "$response" | jq -r '.' || printf "%s\n" "$response"
exit 0
else
echo "$response_body" \
| jq -c 'if type == "object" then . else {raw: .} end' 2>/dev/null \
| jq -s '{status: "http_error", code: $code, response: .[0]}' \
--arg code "$http_code" \
>&2
exit 1
fi
Hataya neden olan sorunu tespit etmenize yardımcı olmak için betiğinizdeki hata bilgilerini standart hata çıkışına (stderr) yazın. Örneğin, aşağıdaki kod parçacığı curl isteği başarısız olduğunda hata bilgilerini yazar ve çıkış kodunu 1 olarak ayarlar. Aynı başarısızlık davranışı geçerlidir: talimat sıfır olmayan bir çıkış kodu döndürürse talimat tekrar çalıştırılmaz ve sistem ilgili hatayı döndürür. Daha fazla bilgi için bkz. Kanca hata kodları.
if ! http_code=$(curl -s -w "%{http_code}" \
-H "Content-Type: application/json" \
-d "$JSON_DATA" \
-o "$temp_file" \
-X POST "$URL"/"$REQUEST_PATH"); then
echo "{\"status\": \"curl_error\", \"code\": $curl_exit_code}" \
| jq . >&2
exit 1
fi
Yaşam döngüsü kancalarını yapılandırma
Function Compute konsoluna giriş yapın. Sol gezinme bölmesinde Function Management > Functions seçeneğini belirleyin.
Üst gezinme çubuğunda bir bölge seçin. Functions sayfasında hedef işlevi tıklayın.
İşlev ayrıntıları sayfasında Configuration sekmesini tıklayın. Instance Configuration bölümünde Modify seçeneğini tıklayın.
-
Instance Configuration panelinde Initializer kancasını yapılandırın. Initializer hook anahtarını açın ve ardından iş gereksinimlerinize göre Initializer timeout değerini ayarlayın. Bu örnekte zaman aşımı
300saniye olarak ayarlanmıştır. hook type için aşağıdaki türlerden birini seçin:-
invoke code
Kanca etkinleştirildikten sonra, örnek başladığında Function Compute işleve bir HTTP POST
/initializeisteği gönderir. İş kodunuz bu isteğe yanıt vermeli ve 200 durum kodunu döndürmelidir. -
execute instruction
Talimat yürütme türü yalnızca GPU hızlandırmalı işlevler için kullanılabilir.
Kanca türü olarak execute instruction seçeneğini belirleyin ve ardından /bin/sh gibi bir kabuk talimatı seçin. Kod düzenleyicide başlatma betiğini yazın. Tam bir örnek için bkz. Talimat yürütme (Yalnızca GPU hızlandırmalı işlevler).
-
(İsteğe bağlı) PreStop kancasını yapılandırın. PreStop hook anahtarını açın ve ardından iş gereksinimlerinize göre PreStop timeout değerini ayarlayın. Bu örnekte zaman aşımı
3saniye olarak ayarlanmıştır.Deploy seçeneğini tıklayın.
Kancaların etkili olduğunu doğrulayın. Örnek oluşturma ve yok etme işlemini tetiklemek için işlevi çağırın veya işlev yapılandırmasını ya da kodunu güncelleyin. Ardından Örnek yaşam döngüsü kancası günlüklerini görüntüleme bölümündeki talimatları izleyerek kanca günlüklerini kontrol edin.
Örnek yaşam döngüsü kancası günlüklerini görüntüleme
Kanca yürütme günlüklerini Real-time Log, Function Logs veya Advanced Logs içinde sorgulayabilirsiniz. Invocation Request List kanca günlüklerini göstermez.
Talimat yürütme kancaları tarafından oluşturulan günlükler Function Logs'a yazılamaz.
Function Logs özelliğini kullanarak kanca günlüklerini görüntüleyebilirsiniz.
Function Compute konsoluna giriş yapın. Sol gezinme bölmesinde Function Management > Functions seçeneğini belirleyin.
Üst gezinme çubuğunda bir bölge seçin. Functions sayfasında hedef işlevi tıklayın.
-
İşlev ayrıntıları sayfasında Test sekmesini tıklayın, Test Function seçeneğini tıklayın ve ardından Logs > Function Logs seçeneğini belirleyin.
Function Logs sekmesinde işlevin çağrı günlüklerini ve Initializer kanca günlüklerini görüntüleyebilirsiniz. Aşağıdaki örnekte günlükler gösterilmektedir.
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*******
Her işlev örneği bir süre önbelleğe alınır ve hemen yok edilmez, bu nedenle PreStop kanca günlükleri hemen kullanılamaz. PreStop kancasını hızlı bir şekilde tetiklemek için işlev yapılandırmasını veya işlev kodunu güncelleyin. Güncelleme tamamlandıktan sonra PreStop kanca günlüklerini görüntülemek üzere Function Logs bölümünü tekrar kontrol edin. Aşağıdaki örnekte günlükler gösterilmektedir.
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*******
Kanca hata kodları
Kod çağırma (Invoke code)
|
|
|
|
|
|
|
|
|
|
|
|
Talimat yürütme (Execute instruction)
Talimat sıfır olmayan bir çıkış kodu döndürürse talimat tekrar çalıştırılmaz ve sistem ilgili hatayı döndürür. Betiğiniz hata bilgilerini stderr'e yazarsa bu çıktıyı kullanarak başarısızlığın nedenini tespit edebilirsiniz.