本文介紹使用Function Compute編寫代碼相關的基礎概念資訊,包括請求處理常式、函數執行個體生命週期回調方法、日誌記錄和錯誤處理等。
請求處理常式
在建立函數時,您需要指定請求處理常式。Function Compute的運行時會載入並調用您的請求處理常式處理請求。請求處理常式包含以下兩種類型:
事件請求處理常式
用於處理除HTTP觸發器以外的各種事件來源觸發的事件請求,例如OSS觸發器、SLS觸發器和RocketMQ觸發器等。
HTTP請求處理常式
用於處理HTTP觸發器觸發的請求調用。更多資訊,請參見配置HTTP觸發器並使用HTTP觸發。
您可以在Function Compute控制台配置請求處理常式。具體操作,請參見建立函數。
函數執行個體生命週期回調方法
按量模式的函數執行個體可供按需建立。閑置時,按量執行個體會被凍結,凍結一段時間會被銷毀。當執行個體狀態發生變化時,您可以配置執行個體生命週期回調方法,回調執行個體狀態。Function Compute支援Initializer、PreFreeze和PreStop三種生命週期回調方法。更多資訊,請參見函數執行個體生命週期。
Initializer回調
Initializer回調在函數執行個體啟動成功之後,執行請求處理常式之前執行。Function Compute保證在一個執行個體生命週期內,成功執行且只能成功執行一次Initializer回調。例如,您的Initializer回調執行失敗後,系統會重新啟動一個函數執行個體執行Initializer流程,直到成功為止,然後再執行您的請求處理常式,Initializer回調失敗的執行個體會直接銷毀。
您可以將資料庫情境下串連池構建、函數依賴庫載入等耗時較長的商務邏輯放到Initializer回調中,避免每次運行函數都會做重複的操作,降低函數延時。
PreFreeze回調
PreFreeze回調在函數執行個體凍結前執行,您可以使用PreFreeze回調完成執行個體凍結前的必要操作,例如,等待指標發送成功等。
PreStop回調
PreStop回調在函數執行個體銷毀前執行,您可以使用PreStop回調完成執行個體銷毀前的必要操作,例如,關閉資料庫連結,以及上報、更新狀態等。
日誌記錄
您需要佈建服務層級的日誌庫,Function Compute會將函數日誌發送到指定日誌庫中。更多資訊,請參見配置日誌。
通過控制台建立服務時,Function Compute預設為您配置日誌庫。
Function Compute與日誌記錄集成,將函數調用的記錄以及函數代碼中列印的日誌全部儲存到日誌庫中。您可以使用Function Compute提供的日誌語句記錄函數日誌,方便調試及定位問題。各種程式設計語言的列印日誌語句,如下表所示。
開發語言 | 程式設計語言內嵌的列印日誌語句 | Function Compute提供的日誌語句 | 參考文檔 |
Node.js | console.log() | context.logger.info() | |
Python | print() | logging.getLogger().info() | |
Java | System.out.println() | context.getLogger().info() | |
PHP | echo "" . PHP_EOL | $GLOBALS['fcLogger']->info() | |
C# | Console.WriteLine("") | context.Logger.LogInformation() |
使用程式設計語言內嵌的列印輸出語句列印的日誌也會被收集到日誌庫裡,而使用Function Compute提供的日誌語句列印的每條日誌前都會帶上請求ID,方便日誌的篩選。
#使用程式設計語言內嵌的列印輸入語句列印的日誌
# print('hello world')
message: hello world
#使用Function Compute提供的日誌語句列印的日誌
# logger.info('hello world')
message: 2020-03-13T04:06:49.099Z f84a9f4f-2dfb-41b0-9d6c-1682a2f3a650 [INFO] hello world
日誌組成
函數作業記錄包括服務名稱、函數名稱、當前執行版本、別名和代碼日誌。
函數作業記錄資料結構如下所示:
__source__:
__tag__:__receive_time__: 1584072413
__topic__: myService
functionName: myFunction
message: 2020-03-13T04:06:49.099Z f84a9f4f-2dfb-41b0-9d6c-1682a2f3a650 [INFO] hello world
qualifier: LATEST
serviceName: myService
versionId: 在函數開始執行時,系統會列印
FC Invoke Start RequestId: f84a9f4f-2dfb-41b0-9d6c-1682a2f3a650,標誌函數執行開始。在函數執行完成時,系統會列印
FC Invoke End RequestId: f84a9f4f-2dfb-41b0-9d6c-1682a2f3a650,標誌函數執行結束。
錯誤處理
Function Compute的錯誤類型有兩種,分別是HandledInvocationError和UnhandledInvocationError。
HandledInvocationError
只有在Node.js中通過
callback返回的錯誤是HandledInvocationError,錯誤資訊在響應內容中體現。'use strict'; module.exports.handler = function(event, context, callback) { console.log('hello world'); callback('this is error', 'hello world'); }響應內容如下所示:
{"errorMessage":"this is error"}UnhandledInvocationError
除了
HandledInvocationError,其餘的錯誤都是UnhandledInvocationError。UnhandledInvocationError的錯誤stackTrace會列印到日誌中,您可以進入日誌查看上下文,找到對應的stackTrace。
作業系統環境
Function Compute使用Debian9 LTS作業系統,當前僅支援x86_64架構。
您可以通過設定層或環境變數來定製作業系統環境。以時區定製為例,函數執行個體預設以UTC時間運行,也就是0時區,當您設定環境變數TZ的值為Asia/Shanghai後,Function Compute的時區被修改為東8區,即北京時間。更多資訊,請參見在函數中配置自訂層和環境變數。