工作原理

最近更新时间:2019-04-01 10:31:37

函数运行时的容器模型

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

在容器启动时需要一些时间,这会使得?#30475;?#35843;用函数时增加一些延迟。但是,通常仅在首次调用函数、更新函数、或长时间未调用时重新调用时会察觉到?#25628;?#36831;,因为平台为了尽量减少此启动延时,会尝试对后续调用重用容器,在调用函数后容器仍会存留一段时间,预期用于下次调用。在此段时间内的调用会直接重用?#20040;?#30041;的容器。

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

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

注意:

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

临时磁盘空间

SCF 函数在执行过程中,?#21152;?#26377;一块 512MB 的临时磁盘空间 /tmp,用户可以在执行代码中对该空间进行一些?#21015;?#25805;作,但这部分数据可能 ?#25442;?/em> 在函数执行完成后保留。因此,如果您需要对执行过程中产生的数据进行持久化存储,请使用 COS 或 Redis/Memcached 等外部持久化存储。

调用类型

SCF 平台支持同步和异步两种调用方式来调用云函数。调用类型与函数本身的配置无关,只有在调用函数时才能控制调用类型。

  • 同步调用函数将会在调?#20204;?#27714;发出后?#20013;?#31561;待函数的执行结果返回
  • 异步调用将?#25442;?#31561;待结果返回,只发出请求并获得当前请求的 Request ID。

以下调用场景您可以?#26434;?#23450;义函数的调用类型:

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

但是,在您使用腾讯云其他云服务作为事件源时,云服务的调用类型是预定义的,用户无法在这?#26234;?#20917;下?#26434;?#25351;定调用类型。例如,COS 和定时器始终异步调用 SCF 函数。

用户限制

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

函数并发量

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

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

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

并发限制

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

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

  • 同步调用:如果函数被同步调用时受到限制,将会直接返回429错误。
  • 异步调用:如果函数被异步调用时受到限制,SCF 将在一定的时间内以固定的频率自动重试受限制的事件。

重试机制

如果您的函数因为超过最大并发数目、或遇到平台内部资源不足等内部限制导致失败。此时,如果您的函数被同步调用,将会直接返回错误(见上面并发执行限制内容)。如果您的函数被内部云服务使用异步方式调用,则?#20040;?#35843;用将会自动进入一个重试队列,SCF 将自动重试调用。

执行环境和可用库

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

  • 标准 CentOS 7.2

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