Serverless 函数
只在有请求时运行 HTTP 服务:空闲时休眠,下一个请求到来时唤醒,负载高时自动扩容,全部在 compose 文件中配置。
函数(function)是只在有请求进来时才运行的 HTTP 服务。最后一个请求过去五分钟后,Cloady 会停止它的容器;下一个请求到来时再重新启动。负载高时,它最多扩容到五个副本。只需一项 compose 设置就能把服务变成函数:deploy.replicas: 0。
标记服务
在响应应用地址的那个服务的 deploy 下设置 replicas: 0:
services:
api:
build: .
ports:
- "3000"
deploy:
replicas: 0必须同时满足以下两点:
deploy.replicas为0。ports:下的第一项是 HTTP 端口,例如"3000"或"8080:3000"。以/tcp或/udp结尾的端口,或者 Cloady 视为数据库、缓存、队列、邮件或游戏端口的端口(5432、6379、25等),都是原始 TCP 端口,而原始 TCP 无法唤醒容器。
使用 build: . 时,Cloady 会用 Railpack(有 Dockerfile 时则用你的 Dockerfile)从你的代码构建该服务,并把 PORT 设为容器端口,因此监听 $PORT 的应用无需任何修改。用 image: 运行的服务也一样。
部署应用
像部署其他 compose 应用一样部署它:把仓库粘贴到部署输入框,把文件夹拖到输入框上,或者使用 CLI:
cloady deploy github.com/acme/api --type git函数部署后处于休眠状态。
调用函数
打开应用的地址。函数休眠时,第一个请求会等待一个副本启动,并在容器开始在其端口上接受连接后得到响应。函数处于唤醒状态时,请求会直接通过。访问应用的自定义域名同样会唤醒它。
这第一次等待主要花在容器自身的启动上,所以镜像越小、启动越快,等待就越短。
扩缩规则
以下限制对所有函数都相同,compose 文件无法修改。函数会:
- 在应用地址或其任一自定义域名收到请求时唤醒;
- 在最后一个请求过去五分钟后休眠;
- 每有 100 个正在处理的请求就扩容一个副本,最多五个副本;
- 函数休眠时,在副本启动期间最多保留第一个请求 90 秒;如果届时仍没有就绪的副本,该请求失败;
- 给每个请求 90 秒时间开始返回响应。
哪些服务可以成为函数
- 只有响应应用地址的那个服务。 每个应用只有一个公开主机名,由它的第一个 HTTP 服务响应(服务与端点),所以请用
ports:发布函数,并给应用的其他服务使用expose:。在其他任何服务上,replicas: 0都会被忽略,该服务会运行一个副本。 - 仅限 HTTP。 TCP 或 UDP 端口无法唤醒容器,所以数据库或游戏服务器永远不会休眠。
- 无状态,且不挂载存储卷。 函数必须能在任何服务器上运行。请求可能落到不同的副本上,副本写入自身文件系统的内容会在它休眠后丢失;而存储卷会把所有副本绑定到存放它的那台服务器上,那台服务器满了时,函数就无法唤醒。请把数据保存在数据库服务中。
搭配数据库
函数休眠时,应用的其他服务会继续运行,所以函数唤醒时,它使用的数据库已经就绪。请给数据库使用 expose: 而不是 ports:,让它只在应用内部可访问:
services:
api:
build: .
ports:
- "3000"
environment:
DATABASE_URL: postgres://app:${DB_PASSWORD}@db:5432/app
deploy:
replicas: 0
db:
image: postgres:17
expose:
- "5432"
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: app
volumes:
- data:/var/lib/postgresql/data
volumes:
data:部署前,请在应用卡片的 Environment 中添加 DB_PASSWORD。
价格
函数的费用与该服务一直运行时相同。Cloady 按应用声明的资源计费,而不是按实际用量计费(容量与价格),并且无论函数处于休眠还是繁忙状态,它的 CPU 和内存都只计算一次。在免费额度之内,它在任何情况下都不收费。
在本地运行
对于设置了 replicas: 0 的服务,docker compose up 不会启动任何容器。给它一个副本:
docker compose up --scale api=1之后修改
对于从 GitHub 仓库构建的应用,在 compose 文件中修改 replicas 并推送,下一次部署就会生效。删除 replicas: 0,函数就会重新变成一直运行的服务。通过上传或从模板目录创建的应用,会一直使用创建时的 compose 文件。
在控制台中
函数休眠时,应用仍显示为运行中。它的状态页会把函数显示为 Idle,Monitor 的可用性检查也不会唤醒它。