本文介紹使用函數計算編寫代碼相關的基礎概念信息,包括請求處理程序、函數實例生命周期回調方法、日志記錄和錯誤處理等。

請求處理程序

在創建函數時,您需要指定請求處理程序。函數計算的運行時會加載并調用您的請求處理程序處理請求。請求處理程序包含以下兩種類型:
  • 事件請求處理程序

    用于處理除HTTP觸發器以外的各種事件源觸發的事件請求,例如OSS觸發器、SLS觸發器和RocketMQ觸發器等。

  • HTTP請求處理程序

    用于處理HTTP觸發器觸發的請求調用。更多信息,請參見配置HTTP觸發器并使用HTTP觸發

您可以在函數計算控制臺配置請求處理程序。具體操作,請參見創建函數

函數實例生命周期回調方法

按量模式的函數實例可供按需創建。閑置時,按量實例會被凍結,凍結一段時間會被銷毀。當實例狀態發生變化時,您可以配置實例生命周期回調方法,回調實例狀態。函數計算支持InitializerPreFreezePreStop三種生命周期回調方法。更多信息,請參見函數實例生命周期

Initializer回調

Initializer回調在函數實例啟動成功之后,執行請求處理程序之前執行。函數計算保證在一個實例生命周期內,成功執行且只能成功執行一次Initializer回調。例如,您的Initializer回調首次執行失敗后系統會重試,直到成功為止,然后再執行您的請求處理程序。

您可以將數據庫場景下連接池構建、函數依賴庫加載等耗時較長的業務邏輯放到Initializer回調中,避免每次運行函數都會做重復的操作,降低函數延時。

PreFreeze回調

PreFreeze回調在函數實例凍結前執行,您可以使用PreFreeze回調完成實例凍結前的必要操作,例如,等待指標發送成功等。

PreStop回調

PreStop回調在函數實例銷毀前執行,您可以使用PreStop回調完成實例銷毀前的必要操作,例如,關閉數據庫鏈接,以及上報、更新狀態等。

日志記錄

說明
  • 您需要配置服務級別的日志庫,函數計算會將函數日志發送到指定日志庫中。更多信息,請參見配置日志
  • 通過控制臺創建服務時,函數計算默認為您配置日志庫。

函數計算與日志記錄集成,將函數調用的記錄以及函數代碼中打印的日志全部存儲到日志庫中。您可以使用函數計算提供的日志語句記錄函數日志,方便調試及定位問題。各種編程語言的打印日志語句,如下表所示。

開發語言 編程語言內嵌的打印日志語句 函數計算提供的日志語句 參考文檔
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() 錯誤處理

使用編程語言內嵌的打印輸出語句打印的日志也會被收集到日志庫里,而使用函數計算提供的日志語句打印的每條日志前都會帶上請求ID,方便日志的篩選。

#使用編程語言內嵌的打印輸入語句打印的日志
# print('hello world')
message:  hello world

#使用函數計算提供的日志語句打印的日志
# 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,標志函數執行結束。

錯誤處理

函數計算的錯誤類型有兩種,分別是HandledInvocationErrorUnhandledInvocationError

  • 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

操作系統環境

函數計算使用Debian9 LTS操作系統,當前僅支持x86_64架構。

您可以通過設置層或環境變量來定制操作系統環境。以時區定制為例,函數實例默認以UTC時間運行,也就是0時區,當您設置環境變量TZ的值為Asia/Shanghai后,函數計算的時區被修改為東8區,即北京時間。更多信息,請參見在函數中配置自定義層環境變量