最佳实践

工作原理

最近更新时间:2020-06-12 11:36:29

函数运行时的容器模型

SCF 将在事件触发时代表您执行 SCF 函数,根据您的配置信息(如内存大小等)进行资源分配,并启动和管理容器(即函数的执行环境)。SCF 平台负责所有函数运行容器的创建、管理和删除清理操作,用户没有权限对其进行管理。

容器启动需要一些时间,这会使每次调用函数时增加一些延迟。但通常仅在首次调用函数、更新函数或长时间未调用时重新调用函数时才会察觉到延迟。因为平台为了尽量减少容器启动延迟,会尝试对后续调用重用容器,在调用函数后容器会根据平台的实际情况存留一段时间,预期用于下次调用,在此时间段内的调用会直接重用该容器。

容器重用机制的意义在于:

  • 用户代码中位于 执行方法 外部的任何声明保持已初始化的状态,再次调用函数时可以直接重用。例如,如果您的函数代码中建立了数据库连接,容器重用时可以直接使用原始连接。您可以在代码中添加逻辑,在创建新连接之前检查是否已存在连接。
  • 每个容器在 /tmp 目录中提供部分磁盘空间。容器存留时该目录内容会保留,提供可用于多次调用的暂时性缓存。再次调用函数时有可能可以直接使用该磁盘内容,您可以添加额外的代码来检查缓存中是否有您存储的数据。
注意:

请勿在函数代码中假定始终重用容器,因为是否重用和单次实际调用相关,无法保证是创建新容器还是重用现有容器。

临时磁盘空间

SCF 函数在执行过程中,都拥有一块512MB的临时磁盘空间 /tmp,用户可以在执行代码中对该空间进行一些读写操作,也可以创建子目录,但这部分数据可能不会在函数执行完成后保留。因此,如果您需要对执行过程中产生的数据进行持久化存储,请使用 COS 或 Redis/Memcached 等外部持久化存储。

调用类型

SCF 平台支持同步和异步两种调用方式来调用云函数。

同步调用

同步调用函数将会在调用请求发出后持续等待函数的执行结果返回。

异步调用

  • 异步调用将不会等待结果返回,只发出请求并获得当前请求的 Request ID。
  • 当发生异步调用时,异步事件会先放置到云函数内置的异步队列,然后再消费异步队列内的事件执行函数。异步队列有如下限制:
    • 异步队列是触发器维度的,一个函数触发器一个队列。
    • 异步事件在队列中的保留时长最大6小时。
    • 异步队列的长度上限为10万条消息。
  • 异步调用的重试策略也有所不同,详情请参见 重试策略

定义函数调用类型

调用类型与函数本身的配置无关,只有在调用函数时才能控制调用类型。

以下调用场景您可以自由定义函数的调用类型:

  • 编写的应用程序调用 SCF 函数。如果您需要同步调用,请在 InvokeFunction 接口中传入参数 invokeType=RequestResponse;如果您需要异步调用则请传入参数 invokeType=Event
  • 手动调用 SCF 函数(使用 API 或 CLI)用于测试。调用时的参数区别同上。

当您使用腾讯云其他云服务作为事件源时,云服务的调用类型是预定义的:

用户限制

函数相关的使用配额及相关环境限制,可见 配额及限制

函数并发量

函数的并发数量是指在任意指定时间对函数代码的执行数量。对于当前的 SCF 函数来说,每个发布的事件请求就会执行一次。因此,这些触发器发布的事件数(即请求量)会影响函数的并发数。您可以使用以下公式来估算并发的函数实例总数目。

每秒请求量 * 函数执行时间(按秒) 

例如,考虑一个处理 COS 事件的函数,假定函数平均用时0.2秒(即200毫秒),COS 每秒发布300个请求至函数。这样将同时生产 300 * 0.2 = 60 个函数实例。

并发限制

当前默认情况下,SCF 对每个函数的并发量有一定限制,您可以通过查看 配额及限制 了解当前函数的并发量限制。您可以通过 联系我们 来调高此数值。

如果调用导致函数的并发数目超过了默认限制,则该调用会被阻塞,SCF 将不会执行这次调用。根据函数的调用方式,受限制的调用的处理方式会有所不同:

  • 同步调用:如果函数被同步调用时受到限制,将会直接返回432错误。
  • 异步调用:如果函数被异步调用时受到限制,SCF 将以一定的策略 自动重试 受限制的事件。

执行环境和可用库

当前 SCF 的执行环境建立在以下基础上:

  • 标准 CentOS 7.2

如果需要在代码中包含可执行的二进制文件、动态库或静态库,请都确保兼容此执行环境。
基于不同语言环境,在 SCF 执行环境下有相关语言的基础库及安装的附加库,您可以在各个语言说明中查看环境中已安装的附加库:

目录