如果您想基於各個語言的流行架構如Flask、Express、SpringBoot或自訂容器鏡像等編寫程式,或者遷移已有的架構應用,請選擇建立Web函數。通過設定執行個體並發度,您可以在流量高峰期有效管理資源使用,降低冷啟動影響,從而提升效能和控製成本。
建立函數
登入Function Compute控制台,在左側導覽列,單擊函數。
在頂部功能表列,選擇地區,然後在函數頁面,單擊建立函數。
在建立函數頁面,選擇Web函數,配置以下配置項,然後單擊建立。
基本設定:設定函數名稱。
函數代碼:配置函數的運行環境和代碼相關資訊。
配置項
說明
樣本
運行環境
選擇您熟悉的語言,例如Python、Java、PHP、Node.js或自訂容器等。
Node.js 16
代碼上傳方式
選擇代碼上傳到Function Compute的方式。
使用範例程式碼:預設,您可以根據業務需要選擇Function Compute為您提供的建立函數的範例程式碼。
通過 ZIP 包上傳代碼:選擇函數代碼ZIP包並上傳。
通過檔案夾上傳代碼:選擇包含函數代碼的檔案夾並上傳。
通過 OSS 上傳代碼:選擇上傳函數代碼的Bucket 名稱和檔案名稱。
使用樣本鏡像:選擇Function Compute內建的樣本鏡像。
使用ACR中的鏡像:選擇 ACR 中的鏡像,在彈出的選擇容器鏡像面板,選擇已建立的容器鏡像執行個體和ACR 鏡像倉庫,然後在下方選擇鏡像地區找到目標鏡像並在其右側操作列單擊選擇。
說明不支援使用跨賬戶ACR中的公開鏡像建立函數。
使用範例程式碼
啟動命令
程式的啟動命令。如果不配置啟動命令,您需要在代碼的根目錄手動建立一個名稱為bootstrap的啟動指令碼,您的程式通過此指令碼來啟動。
npm run start
監聽連接埠
您的代碼中的HTTP Server所監聽的連接埠。
9000
進階配置:配置函數的執行個體相關資訊和函數執行逾時時間等。
配置項
說明
樣本
規格方案
根據您的業務情況,選擇或手動輸入合理的vCPU規格和記憶體規格組合。關於各資源使用的計費詳情,請參見計費概述。
說明vCPU大小(單位為核)與記憶體大小(單位為GB)的比例必須設定在1∶1到1∶4之間。
0.35核,512 MB
臨時硬碟大小
根據您的業務情況,選擇臨時隱藏檔的硬碟大小。
取值說明如下。
512 MB:預設值。不計費,Function Compute為您提供512 MB以內的硬碟免費使用額度。
10 GB:按9.5 GB進行計費。
說明臨時硬碟中所有目錄可寫,共用臨時硬碟的空間。
臨時硬碟大小與底層執行函數的執行個體生命週期一致,執行個體被系統回收後,硬碟上的資料也會消失。如您需要對檔案進行持久化儲存,可以選擇掛載NAS或OSS。具體操作,請參見配置NAS檔案系統和配置OSSObject Storage Service。
512 MB
執行逾時時間
設定逾時時間。執行逾時時間預設為60秒,最長為86400秒。
60
單一實例並發度
說明當您建立函數的方式選擇Web函數或容器鏡像時,需設定此配置項。
Function Compute支援一個執行個體同時並發執行多個請求,這個值用來配置單個函數執行個體可以同時處理多少個請求。具體操作,請參見設定單一實例並發度。
20
時區
選擇函數的時區。在此處設定函數的時區後,將自動為函數添加一條環境變數TZ,其值為您設定的目標時區。
UTC
函數角色
Function Compute平台會使用這個RAM角色來產生訪問您的阿里雲資源的臨時密鑰,並傳遞給您的代碼。更多資訊,請參見授予Function Compute訪問其他雲端服務的許可權。
mytestrole
允許訪問 VPC
是否允許函數訪問VPC內資源。更多資訊,請參見配置網路。
是
專用網路
允許訪問 VPC選擇是時必填。建立新的VPC或在下拉式清單中選擇要訪問的VPC ID。
fc.auto.create.vpc.1632317****
交換器
允許訪問 VPC選擇是時必填。建立新的交換器或在下拉式清單中選擇交換器ID。
fc.auto.create.vswitch.vpc-bp1p8248****
安全性群組
允許訪問 VPC選擇是時必填。建立新的安全性群組或在下拉式清單中選擇安全性群組。
fc.auto.create.SecurityGroup.vsw-bp15ftbbbbd****
允許函數預設網卡訪問公網
是否允許函數可以通過預設網卡訪問公網。關閉後,當前服務中的函數將無法通過Function Compute的預設網卡訪問公網。
重要使用固定公網IP地址功能時,您必須關閉允許函數預設網卡訪問公網,否則配置的固定公網IP地址不生效。更多資訊,請參見配置固定公網IP地址。
是
日誌功能
是否啟用阿里雲Log Service。取值說明如下:
啟用:函數的執行日誌被持久化儲存到Log Service,方便您進行代碼調試、故障分析和資料分析等。
禁用:函數的執行日誌將無法通過Log Service儲存和查詢。
啟用
環境變數:設定函數運行環境中的環境變數。更多資訊,請參見配置環境變數。
函數建立成功後進入函數詳情頁,您可以在代碼頁簽修改函數代碼、部署代碼及測試函數。
更新函數:函數建立成功後,您可以在配置頁簽,按需修改相應的配置項。
刪除函數:您也可以在函數列表頁、函數詳情頁根據提示刪除不需要的函數。
設定單一實例並發度
執行個體並發度指定了每個函數執行個體可以同時處理的最大並發請求數。通過在Function Compute中設定執行個體並發度,您可以在流量高峰期有效管理資源使用,降低冷啟動影響,從而達到提升效能和控製成本的目的。
背景資訊
Function Compute按執行個體執行時間長度計費。假設同時有3個請求需要處理,每個請求需要10秒,並發度不同執行時間長度也不同。
當執行個體並發度設定為1時,每個執行個體同時只能處理1個請求,Function Compute需要建立3個執行個體來處理這3個請求,總的執行時間長度是30秒。
當執行個體並發度設定為10時,每個執行個體同時可以處理10個請求,Function Compute只需要建立1個執行個體就能處理這3個請求,總的執行時間長度是10秒。
預設情況下,函數的執行個體並發度為1,也就是一個執行個體同時只會處理一個請求。當您設定單一實例並發度大於1後,Function Compute在Auto Scaling時,充分利用完一個執行個體的並發度後才會建立新的執行個體。
執行個體並發度設定為不同的值時,請求執行的區別如下圖所示。
應用情境
單一實例多並發功能適用於函數中有較多時間在等待下遊服務響應的情境。等待響應一般不消耗資源,在一個執行個體內並發處理,不僅可以節省費用,還能提高應用響應能力和輸送量。
優勢
減少執行時間長度,節省費用。
例如,偏I/O的函數可以在一個執行個體內並發處理,減少執行個體數從而減少總的執行時間長度。
請求之間狀態可共用。
多個請求可以在一個執行個體內共用資料庫連接池,從而減少和資料庫之間的串連數。
降低冷啟動機率。
由於多個請求可以在一個執行個體內處理,建立新執行個體的次數會變少,冷啟動機率降低。
減少VPC IP地址的佔用。
在相同負載下,單一實例多並發可以降低總的執行個體數,從而減少VPC IP地址的佔用。
重要您的VPC綁定的vSwitch中至少需要兩個可用的IP地址,否則可能會導致服務不可用造成請求失敗。
使用限制
限制項 | 描述 |
支援的Runtime |
|
單一實例並發度取值範圍 | 1~200 |
調用響應中的函數日誌(X-Fc-Log-Result) | 執行個體並發數>1時不支援 |
操作步驟
您可以在建立或更新函數時,指定函數的單一實例並發度。
使用Web 函數建立函數時,可以配置單一實例並發度。
如果您使用了預留模式,預留模式下的函數也可以並發處理多個請求。更多資訊,請參見配置預留執行個體。
設定單一實例多並發的影響
設定了單一實例多並發(執行個體並發數>1)之後,與單一實例單並發(執行個體並發數=1)在以下幾個方面有區別。
計費
單一實例單並發與單一實例多並發在執行時間長度上會不同,從而費用也不同。更多計費詳情,請參見計費概述。
單一實例單並發
函數執行個體在同一時間只能處理1個請求,1個請求處理完了再處理下一個請求。計費時間長度從處理第一個請求開始,到最後一個請求結束為止。
單一實例多並發
多個請求在一個執行個體並發處理時,以執行個體的實際佔用時間作為計費的執行時間長度,即從第一個請求開始,到最後一個請求結束期間的時間長度。
並發度流控
Function Compute在一個地區中按量執行個體數的上限預設值為300,一個地區可以同時處理的最大請求數為“300×執行個體並發數”。例如,設定執行個體並發數=10時,則一個地區最多允許同時處理3000個並發請求。當並發請求數超過Function Compute可以處理的最大請求數時,會收到流控錯誤提示ResourceExhausted。
如您需要擴大某個地區的按量執行個體數上限,請聯絡我們。
日誌
在單併發模式下,在調用函數時指定HTTP頭
X-Fc-Log-Type: Tail
,Function Compute會在回應標頭X-Fc-Log-Result
中包含本次調用所產生的函數日誌。在多併發模式下,由於多個請求並發執行,無法擷取某個特定請求的日誌,回應標頭中不再包含本次調用的函數日誌。針對Node.js Runtime,原來的日誌方式是使用
console.info()
函數,該方式會把當前請求的Request ID包含在日誌內容中。當多請求在同一個執行個體並發處理時,當前請求可能有很多個,繼續使用console.info()
列印日誌會導致Request ID錯亂,Request ID都會變成req 2
。列印日誌樣本如下。2019-11-06T14:23:37.587Z req1 [info] logger begin 2019-11-06T14:23:37.587Z req1 [info] ctxlogger begin 2019-11-06T14:23:37.587Z req2 [info] logger begin 2019-11-06T14:23:37.587Z req2 [info] ctxlogger begin 2019-11-06T14:23:40.587Z req1 [info] ctxlogger end 2019-11-06T14:23:40.587Z req2 [info] ctxlogger end 2019-11-06T14:23:37.587Z req2 [info] logger end 2019-11-06T14:23:37.587Z req2 [info] logger end
此時應該使用
context.logger.info()
函數列印日誌,該方式仍保留了請求的獨立Request ID。程式碼範例如下。exports.handler = (event, context, callback) => { console.info('logger begin'); context.logger.info('ctxlogger begin'); setTimeout(function() { context.logger.info('ctxlogger end'); console.info('logger end'); callback(null, 'hello world'); }, 3000); };
錯誤處理
多個請求在一個執行個體並發處理時,由於一個請求處理不當導致進程退出或者崩潰,會導致正在並發處理的其他請求也收到錯誤資訊。這要求您在編寫函數時,盡量捕獲請求層級的異常,不影響其他請求。Node.js程式碼範例如下。
exports.handler = (event, context, callback) => {
try {
JSON.parse(event);
} catch (ex) {
callback(ex);
}
callback(null, 'hello world');
};
共用變數
多個請求在一個執行個體並發處理時,同時修改一個共用的變數,可能會導致錯誤。這要求您在編寫函數時,對於非安全執行緒的變數修改要進行互斥保護。Java程式碼範例如下。
public class App implements StreamRequestHandler
{
private static int counter = 0;
@Override
public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
synchronized (this) {
counter = counter + 1;
}
outputStream.write(new String("hello world").getBytes());
}
}
監控指標
設定函數的執行個體並發度後,在相同的負載下,可以在控制台的函數按量執行個體數監控圖中看到函數已使用的執行個體數明顯地減少。
相關文檔
除控制台外,Function Compute還提供API的方式來管理函數,具體請查看函數。
函數執行逾時,您可以嘗試的操作見函數執行逾時,報錯Function time out after怎麼辦?。
使用頻率較低的函數調用時間會比較長,具體原因見為什麼使用頻率較低的函數調用時間比較長?。如果想消除冷啟動延時的影響,可以使用預留模式的執行個體,具體可參考如何讓執行個體一直存活不銷毀,消除冷啟動延時的影響?。
如果您想擷取函數的ARN在代碼中定位阿里雲資源,可參見擷取函數ARN。