基本概念

最近更新时间:2018-08-28 15:18:38

用户在使用 SCF 平台支持的语言编写代码时,需要采用一个通用的范式,包含以下核心概念:

执行方法

执行方法决定了 SCF 平台从何处开始执行您的代码,以文件名.方法名的形式被用户指定。SCF 在调用云函数时,将通过寻找执行方法来开始执行您的代码。例如,用户指定的执行方法为index.handler,则平台会首先寻找代码程序包中的 index 文件,并找到该文件中的 handler 方法开始执行。

用户在编写执行方法时需遵循平台特定的编程模型,该模型中指定固定的入参:事件数据 event 和环境数据 context。执行方法应该对参数进行处理,并且可任意调用代码中的任何其他方法。

函数入参

函数入参,是指函数在被触发调用时,所传递给函数的内容。通常情况下,函数入参包括两块:event 入参与 context 入参。根据开发语言和环境的不同,入参个数可能有所不同,不同开发语言在入参上的具体差异,可见 开发语言说明

注意:
为保证针对各开发语言和环境的统一性,event 入参和 context 入参都是使用 JSON 数据格式统一封装。

event 入参

SCF 平台将 event 入参传递给执行方法,通过此 event 入参对象,代码将与触发函数的事件(event)交互。
例如:由于文件上传触发了函数运行,代码可从 event 参数中获取该文件的所有信息,包括文件名、下载路径、文件类型、大小等。
不同触发器在触发函数时,所传递的数据结构均有所不同,具体数据结构可见 函数触发器说明。同时在通过云 API 方法触发云函数时,用户可自行定义传递给云函数的入参。

context 入参

SCF 平台将 context 入参传递给执行方法,通过此 context 入参对象,代码将能了解到运行环境及当前请求的相关内容。当前 context 内容如下:

{
    "time_limit_in_ms": 3000, 
    "request_id": "627466b4-8049-11e8-8758-5254005d5fdb",
    "memory_limit_in_mb": 512
}

其中包括了当前调用的执行超时时间,内存限制,以及当次请求 ID。

注意:
context 结构内容将可能随着 SCF 平台的开发迭代而增加更多内容。

函数返回

云函数执行完成后的返回值,会由 SCF 平台获取到,并根据不同的触发方式进行处理。

  • 同步触发:通过同步方式触发的云函数,在函数执行期间,请求不会返回。在函数执行完成后,会将函数返回值封装为 JSON 格式以后返回给调用方。通过 API 网关、云 API 中 RequestResponse 方式触发的方式为同步触发。
  • 异步触发:通过异步方式触发的云函数,在触发事件由 SCF 平台接收后,触发请求就会返回。在函数执行完成后,函数的返回值会封装为 JSON 格式后存储在日志中。如果用户需要在异步触发后获取到函数返回值,可通过记录请求返回中的 requestId,并在函数执行完成后,通过 requestId 查询日志,获取到此次执行的函数返回值。

注意:
为保证针对各开发语言和环境的统一性,函数返回会使用 JSON 数据格式统一封装。

日志

SCF 平台会将函数调用的所有记录及函数代码中的输出全部存储在日志中,请使用编程语言中的打印输出语句或日志语句生成输出日志,以便作调试及故障排除之用。

在函数运行日志中,包括了函数名、启动时间、执行时间、计费时间、内存实际用量、返回码、返回值、代码日志、执行状态信息。

函数的运行日志通常数据结构如下所示:

{
    "functionName": "testnode",
    "retMsg": "\"ok\"",
    "requestId": "b33b9d0b-9c51-11e7-b38f-525400c7c826",
    "startTime": "2017-09-18 17:13:57",
    "retCode": 0,
    "invokeFinished": 1,
    "duration": 7.437,
    "billDuration": 100,
    "memUsage": 131072,
    "log": "2017-09-18T09:13:57.155Z\tundefined\tHello World\n2017-09-18T09:13:57.156Z\tundefined\t{ Records: [ { CMQ: [Object] } ] }\n2017-09-18T09:13:57.158Z\tundefined\t{ msgBody: '3',\n  msgId: '3096224743817223',\n  msgTag: '',\n  publishTime: '2017-09-18T17:13:57Z',\n  requestId: '5761047512720426853',\n  subscriptionName: 'test',\n  topicName: 'test',\n  topicOwner: 1251762227,\n  type: 'topic' }\n2017-09-18T09:13:57.159Z\tundefined\t{ callbackWaitsForEmptyEventLoop: [Getter/Setter],\n  done: [Function: done],\n  succeed: [Function: succeed],\n  fail: [Function: fail],\n  memory_limit_in_mb: 128,\n  time_limit_in_ms: 30000 }\n"
}

注意事项

由于无服务器云函数的特点,必须 以无状态的风格编写您的函数代码。本地文件存储等函数生命周期内的状态特征在函数调用结束后将随之销毁。因此,持久状态建议存储在关系型数据库 CDB、对象存储 COS、云数据库 Memcached 或其他云存储服务中。