cloady文档
文档阅读约 4 分钟

Serverless 函数

只在有请求时运行 HTTP 服务:空闲时休眠,下一个请求到来时唤醒,负载高时自动扩容,全部在 compose 文件中配置。

函数(function)是只在有请求进来时才运行的 HTTP 服务。最后一个请求过去五分钟后,Cloady 会停止它的容器;下一个请求到来时再重新启动。负载高时,它最多扩容到五个副本。只需一项 compose 设置就能把服务变成函数:deploy.replicas: 0。

标记服务

在响应应用地址的那个服务的 deploy 下设置 replicas: 0:

YAML
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:

Terminal
cloady deploy github.com/acme/api --type git

函数部署后处于休眠状态。

调用函数

打开应用的地址。函数休眠时,第一个请求会等待一个副本启动,并在容器开始在其端口上接受连接后得到响应。函数处于唤醒状态时,请求会直接通过。访问应用的自定义域名同样会唤醒它。

这第一次等待主要花在容器自身的启动上,所以镜像越小、启动越快,等待就越短。

扩缩规则

以下限制对所有函数都相同,compose 文件无法修改。函数会:

  • 在应用地址或其任一自定义域名收到请求时唤醒;
  • 在最后一个请求过去五分钟后休眠;
  • 每有 100 个正在处理的请求就扩容一个副本,最多五个副本;
  • 函数休眠时,在副本启动期间最多保留第一个请求 90 秒;如果届时仍没有就绪的副本,该请求失败;
  • 给每个请求 90 秒时间开始返回响应。

哪些服务可以成为函数

  • 只有响应应用地址的那个服务。 每个应用只有一个公开主机名,由它的第一个 HTTP 服务响应(服务与端点),所以请用 ports: 发布函数,并给应用的其他服务使用 expose:。在其他任何服务上,replicas: 0 都会被忽略,该服务会运行一个副本。
  • 仅限 HTTP。 TCP 或 UDP 端口无法唤醒容器,所以数据库或游戏服务器永远不会休眠。
  • 无状态,且不挂载存储卷。 函数必须能在任何服务器上运行。请求可能落到不同的副本上,副本写入自身文件系统的内容会在它休眠后丢失;而存储卷会把所有副本绑定到存放它的那台服务器上,那台服务器满了时,函数就无法唤醒。请把数据保存在数据库服务中。

搭配数据库

函数休眠时,应用的其他服务会继续运行,所以函数唤醒时,它使用的数据库已经就绪。请给数据库使用 expose: 而不是 ports:,让它只在应用内部可访问:

YAML
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 不会启动任何容器。给它一个副本:

Terminal
docker compose up --scale api=1

之后修改

对于从 GitHub 仓库构建的应用,在 compose 文件中修改 replicas 并推送,下一次部署就会生效。删除 replicas: 0,函数就会重新变成一直运行的服务。通过上传或从模板目录创建的应用,会一直使用创建时的 compose 文件。

在控制台中

函数休眠时,应用仍显示为运行中。它的状态页会把函数显示为 Idle,Monitor 的可用性检查也不会唤醒它。


下一步:参阅核心概念,了解服务、端点和价格;或参阅 CLI 参考,了解 cloady deploy。

本页内容