运行机制
云函数的特点
无状态
CloudBase 会根据当前负载情况,自动控制云函数实例的数量,并且均衡地分发请求。连续的多次请求有可能由同一实例处理,也可能不是。
所以,开发者在编写云函数时,应注意保证云函数是无状态的、幂等的,即当次云函数的执行不依赖上一次云函数执行过程中在运行环境中残留的信息。
事件模型与触发器
云函数采用事件触发模型,每一次调用本质上是触发了一次云函数调用事件。
云函数的调用方,一般被称为「触发器」,目前 CloudBase 云函数支持以下触发器:
- SDK 调用触发;
- HTTP 触发(请参考 使用 HTTP 访问云函数);
- 定时器触发(请参考 定时触发器)。
自动扩缩容
开发者无需关心云函数扩容和缩容的问题,平台会根据负载自动进行扩缩容。
云函数的入参
每个云函数的传入参数有两个对象, event
对象和 context
对象。
event 对象
event
对象指的是触发云函数的事件。例如:
- 在小程序端调用时,
event
是小程序端调用云函数时传入的参数; - 在使用 HTTP 请求的形式调用时,
event
是 集成请求体。
context 对象
context
对象包含了此调用的调用信息和函数的运行状态,可以使用 context
了解服务运行的情况。
简单示例
本段代码的含义指将传入的 a 和 b 相加并作为 sum 字段返回给调用端。 例如,我们定义一个云函数,命名为 add ,功能是将传入的两个参数 a 和 b 相加。示例代码如下:
// index.js 是入口文件,云函数被调用时会执行该文件导出的 main 方法
// event 包含了调用端调用该函数时传过来的参数,同时还包含了用户登录态 `openId` 和应用 `appId` 信息
exports.main = async (event, context) => {
let { a, b } = event;
let sum = a + b;
return {
sum,
};
};
运行环境
- 云函数运行在云端容器化的 Unix 环境中;
- 云函数在处理并发请求的时候会创建多个云函数实例;
- 每个云函数实例之间相互隔离,没有公用的内存或硬盘空间;
- 如果有临时读写文件的需求,可以使用
/tmp
目录,这是一块 512MB 的临时磁盘空间,用于处理单次云函数执行过程中的临时文件读写需求; - 云函数实例的创建、管理、销毁等操作由平台自动完成。
- 目前云函数的运行环境 CentOS 7.2,开发者编写代码时,不应依赖特定的操作系统或操作系统的版本号,因为运行环境可能随时会发生变化。
- 函数的临时磁盘空间在函数执行完毕后可能被销毁,不应依赖和假设在磁盘空间存储的临时文件会一直存在。如果需要持久化的存储,请使用 云存储 功能。
运行时
当前支持以下运行时:
- Node.js 12.16
- Node.js 10.15
- Node.js 8.9
- PHP 7.2
- Python 2.7
- Python 3.6
- Golang 1
- Java 8
内存限制
内存默认限制为 256 MB,您也可以调整限制为 128 MB ~ 2048 MB。
函数并发量
函数的并发数量是指在任意指定时间对函数代码的执行数量。对于函数来说,每个请求就会执行一次。因此,请求量会影响函数的并发数。
当前默认情况下,单个云函数的最大并发函数实例数为 1000。
如果调用导致函数的并发数目超过了默认限制,则该调用会被阻塞,将不会执行这次调用。
公式:并发函数实例数 = 每秒请求量 * 函数执行时间(按秒)
例子:假定函数平均用时 0.2 秒(即 200 毫秒),每秒 300 个请求至函数。这样将同时生产 300 * 0.2 = 60 个函数实例。
注:如果想达到函数的最大并发函数实例数 1000,函数平均耗时为 0.2 秒,则每秒请求数(QPS)需要达到 5000。