Bu konu, özel çalışma zamanındaki işlevlerin çağrılma yöntemlerini, sınırlamalarını ve kod örneklerini açıklar.
Arka plan bilgileri
Özel bir çalışma zamanı HTTP sunucunuzu barındırabilir. Function Compute, işlev çağırma isteklerini HTTP isteklerine dönüştürüp HTTP sunucunuza gönderir. Ardından HTTP sunucunuzdan gelen yanıtları işlev çağırma yanıtlarına çevirerek istemciye döndürür. Aşağıdaki şekil bu süreci gösterir.
Bir işlevi aşağıdaki iki yöntemden biriyle çağırabilirsiniz:
HTTP çağrısı (önerilen): İşlevi HTTP üzerinden çağırın; örneğin bir HTTP tetikleyicisi veya özel etki alanı adı kullanın.
API çağrısı: InvokeFunction API'sini çağırarak işlevi çalıştırın; örneğin bir SDK kullanarak işlevi çağırın veya bir olay kaynağı aracılığıyla işlevi tetikleyin.
Farklı çağrılma yöntemleri, HTTP sunucunuzun istek ve yanıt biçimlerinin farklı olmasına neden olur.
Sınırlamalar
Bir işlevin her sürümü veya takma adı için yalnızca bir HTTP tetikleyicisi oluşturabilirsiniz. Daha fazla bilgi için bkz. Sürümleri yönetme ve Takma adları yönetme.
-
HTTP isteği sınırlamaları
-
İstek üstbilgileri,
x-fc-ile başlayan veya aşağıdaki özel alanları içeren özel alanları desteklemez:connection
keep-alive
-
Bir istek aşağıdaki sınırları aşarsa
400durum kodu veInvalidArgumenthata kodu döndürülür.Üstbilgi boyutu: Üstbilgilerdeki tüm anahtarların ve değerlerin toplam boyutu 8 KB'yi aşamaz.
Yol boyutu: Tüm sorgu parametreleri dahil yolun toplam boyutu 4 KB'yi aşamaz.
Gövde boyutu: Eşzamanlı bir çağrının istek gövdesinin toplam boyutu 32 MB'yi aşamaz. Zaman uyumsuz bir çağrının istek gövdesinin toplam boyutu 128 KB'yi aşamaz.
-
-
HTTP yanıtı sınırlamaları
-
Yanıt üstbilgileri,
x-fc-ile başlayan veya aşağıdaki özel alanları içeren özel alanları desteklemez:connection
content-length
date
keep-alive
server
-
content-disposition:attachment
NotGüvenlik nedeniyle, Function Compute'un varsayılan aliyuncs.com etki alanını kullandığınızda sunucu, yanıt üstbilgilerine zorla
content-disposition: attachmentüstbilgisini ekler. Bu üstbilgi, yanıtın tarayıcıda bir ek olarak indirilmesine neden olur. Bu kısıtlamayı kaldırmak için özel bir etki alanı adı yapılandırın.
-
Bir yanıt aşağıdaki sınırları aşarsa
502durum kodu veBadResponsehata kodu döndürülür.Üstbilgi boyutu: Üstbilgilerdeki tüm anahtarların ve değerlerin toplam boyutu 8 KB'yi aşamaz.
-
-
Diğer kullanım notları
Özel bir etki alanı adı bağlayarak farklı HTTP erişim yollarını işlevinize eşleyebilirsiniz. Daha fazla bilgi için bkz. Özel etki alanı adı yapılandırma.
HTTP çağrısı (önerilen)
HTTP çağrıları için Function Compute passthrough modunu kullanır. İstemcinin HTTP isteğini doğrudan HTTP sunucunuza iletir ve HTTP sunucusunun yanıtını istemciye geçirir. Bazı sistem tarafından ayrılmış alanlar geçirilmez. Daha fazla bilgi için bkz. Sınırlamalar.
İstek üstbilgileri
Bir işlevi HTTP tetikleyicisi veya özel etki alanı adı kullanarak çağırdığınızda, Function Compute istek davranışını kontrol etmek için istek üstbilgilerini yapılandırmanıza olanak tanır. Aşağıdaki tabloda desteklenen istek üstbilgileri açıklanmaktadır.
|
Ad |
Tür |
Gerekli |
Örnek |
Açıklama |
|
X-Fc-Invocation-Type |
String |
Hayır |
Sync |
Çağırma yöntemi. Daha fazla bilgi için bkz. Çağırma yöntemleri. Geçerli değerler:
|
|
X-Fc-Log-Type |
String |
Hayır |
Tail |
Yanıtta döndürülecek günlükler. Geçerli değerler:
|
Yanıt üstbilgileri
Bir işlevi HTTP tetikleyicisi veya özel etki alanı adı kullanarak çağırdığınızda, yanıt Function Compute tarafından varsayılan olarak eklenen bazı yanıt üstbilgilerini içerir. Aşağıdaki tabloda yanıt üstbilgileri açıklanmaktadır.
|
|
|
|
|
|
|
|
API çağrısı
InvokeFunction API'si kullanılarak yapılan çağrılar için Function Compute, InvokeFunction isteğini bir HTTP isteğine dönüştürür ve HTTP sunucunuza gönderir. Dönüşüm kuralları aşağıdaki gibidir:
InvokeFunction'ın
eventparametresi, HTTP isteğinin mesaj gövdesine dönüştürülür.pathdeğeri/invokeşeklindedir.methoddeğeriPOSTşeklindedir.Content-Typemesaj üstbilgisiapplication/octet-streamşeklindedir.
Function Compute, HTTP sunucunuzun yanıtını InvokeFunction yanıtına dönüştürür ve istemciye döndürür. Dönüşüm kuralları aşağıdaki gibidir:
HTTP yanıt gövdesi, InvokeFunction yanıt gövdesine dönüştürülür.
HTTP yanıt üstbilgileri ve durum kodu dönüşüm sırasında kaybolur.
Invoke API isteği dönüşüm örneği
|
Invoke isteği |
HTTP isteği (HTTP sunucusu tarafından alınan istek) |
|
Invoke API istek içeriği:
|
|
Invoke API yanıtı çıkış örneği
|
HTTP yanıtı |
Invoke yanıtı |
|
|
|
|
Function Compute yanıt kodları ve yanıt üstbilgileri
Özel bir çalışma zamanı, temel olarak sizin uyguladığınız bir HTTP sunucusudur. Bu nedenle, her işlev çağrısı bir HTTP isteğidir ve her yanıt bir yanıt kodu ile yanıt üstbilgileri içerir.
-
Yanıt kodu
StatusCode200: başarılı.404: başarısız.
-
Yanıt üstbilgisi
x-fc-status200: başarılı.404: başarısız.
İşlevin başarıyla yürütülüp yürütülmediğini Function Compute'a bildirmek için x-fc-status yanıt üstbilgisini kullanabilirsiniz.
-
x-fc-statusayarlanmazsa: Function Compute, çağrının varsayılan olarak başarıyla yürütüldüğünü kabul eder. Ancak, işleviniz Function Compute'a bildirilmeyen bir özel durumla karşılaşmış olabilir. Function Compute yürütmeyi hatasız olarak değerlendirir. Bu durum iş mantığınızı etkilemeyebilir ancak izleme ve gözlemlenebilirliği etkiler. Aşağıdaki kod bir örnek göstermektedir:print("FC Invoke Start RequestId: " + rid) data = request.stream.read() print("Path: " + path) print("Data: " + str(data)) # Simulate an exception to trigger a runtime error raise Exception("mock exception") print("FC Invoke End RequestId: " + rid) return "Hello, World!" if __name__ == '__main__': app.run(host='0.0.0.0', port=9000) -
x-fc-statusayarlanırsa: İşleviniz bir özel durumla karşılaşırsa, yürütme hatasını Function Compute'a bildirmek içinx-fc-statusyanıt üstbilgisini kullanabilirsiniz ve hata yığını bilgileri günlüklere yazdırılır. Aşağıdaki örnekte gösterildiği gibi,x-fc-statusyanıt üstbilgisini404olarak ayarladıktan sonra Function Compute çağrıyı başarısız bir yürütme olarak tanımlar. Hata türüInvocationErrorolup döndürülen sonuçmock exceptiondeğeridir. app.py içindeki örnek kod aşağıdaki gibidir:@app.route('/', defaults={'path': ''}) @app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE']) def hello_world(path): rid = request.headers.get(REQUEST_ID_HEADER) print("FC Invoke Start RequestId: " + rid) try: raise Exception("mock exception") except Exception as e: print("FC Invoke End RequestId: " + rid + ", Error: Unhandled Exception") print(str(e)) return str(e), 404, [{"x-fc-status", "404"}]
Döndürülen HTTP yanıtında hem StatusCode hem de x-fc-status değerlerini ayarlamanızı öneririz.
Kod örneği
İşlev için bir tetikleyici yapılandırıldıysa, herhangi bir dilde bir HTTP sunucusu uygulayabilirsiniz. Bu konuda Python örnek olarak kullanılmıştır. Örnek kod aşağıdaki gibidir.
Örnek kod, bir Python ortamına ve Flask kitaplığına bağlıdır. İşlev oluşturma yöntemi olarak Web Function seçmenizi ve çalışma zamanı olarak Python 3.10 seçmenizi öneririz.
import os
from flask import Flask
from flask import request
REQUEST_ID_HEADER = 'x-fc-request-id'
app = Flask(__name__)
@app.route('/', defaults={'path': ''})
@app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE'])
def hello_world(path):
rid = request.headers.get(REQUEST_ID_HEADER)
data = request.stream.read()
print("Path: " + path)
print("Data: " + str(data))
return "Hello, World!", 200, [('Function-Name', os.getenv('FC_FUNCTION_NAME'))]
if __name__ == '__main__':
app.run(host='0.0.0.0', port=9000)
Örnek kodun açıklaması aşağıdaki gibidir:
@app.route('/', defaults={'path': ''}): kök yola karşılık gelen varsayılan rota.@app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE']): yol parametresi içeren dinamik rota. GET, POST, PUT ve DELETE isteklerini işleyebilir. Yol parametresinin değeri, path bağımsız değişkeni olarak hello_world işlevine aktarılır.rid = request.headers.get(REQUEST_ID_HEADER): istek üstbilgilerindekix-fc-request-idalanının değerini alır.data = request.stream.read(): istek içeriğini okur ve data değişkenine atar.return "Hello, World!", 200, [('Function-Name', os.getenv('FC_FUNCTION_NAME'))]: "Hello, World!" içeren bir yanıt gövdesi döndürür, durum kodunu 200 olarak ayarlar ve birFunction-Nameüstbilgisi ekler.