应用的每个实例都是一个从版本模板创建的沙箱,所以创建时其中的服务已经在运行。它出现在项目的沙箱列表中,带有 app 标签,和其他沙箱一样计量,你也可以在里面运行命令 (glac sandboxes exec)。
实例何时休眠
只有三样东西能让实例保持运行:
- 它正在响应的请求(打开着的 HTTP/2 流,比如一次 gRPC 调用,在结束前都算一个请求);
- 使用它的 API 调用,比如在里面运行的命令;
- 它自己的程序提出的保持请求(见下文)。
CPU 占用、网络包、打开的连接和定时器都不会让它保持运行。最后一样结束后,它会等一会儿再休眠。等多久根据应用自己的流量决定:请求间隔比一次休眠加一次唤醒还短时,它会在间隔中保持运行;请求间隔很长时,它一响应完就休眠。scale.sleep_after_ms 是它最长的等待时间(默认三秒,最多 600,000 毫秒;0 表示总是立即休眠)。在应用收到少量请求之前,以及实例打开着 WebSocket 时,如果你设置了 sleep_after_ms,它会等满这个时间,否则等 100 毫秒。它在响应之后做的工作会被暂停,直到下一个请求把它唤醒。实例休眠时 WebSocket 保持打开,上面来了新数据就会唤醒它。
响应之后的工作
响应之后还有工作要做的处理程序(类似其他平台上的 ctx.waitUntil()),要在响应之前通过实例内的 Unix 套接字 /run/sbx/awake 提出保持请求,工作完成后再撤销。之后实例会像处理完请求后那样等一会儿,然后停止。如何提出保持请求,以及示例代码,见休眠与唤醒。
scale.sleep_hold_max_ms限制空闲时间用完之后,保持请求最多还能让实例保持运行多久:默认 30,000 毫秒,最多 900,000 毫秒;0表示忽略保持请求。scale.sleep_notice_ms让实例的程序在它停止前这么久收到sleep <ms>通知(默认不通知,最多 60,000 毫秒)。- 被保持期间,实例按运行计量。
实例何时被删除
在 scale.delete_after_ms 内没有任何东西让它保持运行的实例会被删除:默认一小时,你可以设得更短,最短一秒。下一个请求会在几毫秒内从模板创建一个新实例。被删除的实例什么都不保留,所以必须保存数据的服务要使用云盘,或者使用会被保留的键控实例。
实例数量
| 设置 | 作用 |
|---|---|
scale.min_instances |
每个区域中保持运行的实例数,无论有没有请求(默认 0)。它们按运行计量。 |
scale.max_instances |
一个区域中最多的实例数。不设置时,取套餐对未设置此项的应用规定的数量(见下文)。 |
scale.concurrency |
一个实例同时处理的最多请求数,1 到 1,000。不设置时,实例的 CPU 或内存满了就算满,平台会再启动一个实例。一次只处理一个请求的服务应该设为 1。 |
glac cube update api --min-instances 1 --max-instances 20 --concurrency 50 --sleep-after-ms 2000这些设置立即生效,不会产生新版本。超过套餐的数量时,部署或更新会被拒绝(403 plan_cap_reached,param 为 app_instances):
| 免费版 | 付费版 | |
|---|---|---|
单个应用在一个区域的实例数:未设 max_instances 时 / 最多 |
2 / 5 | 50 / 500 |
| 同时运行的实例 | 5 | 500 |
| vCPU 合计 | 10 | 500 |
| 内存合计 | 10 GiB | 1,000 GiB |
运行中的实例数、vCPU 和内存按整个账户计算,连同账户的沙箱一起。分布在多个区域的应用在这些区域之间分享账户剩余的额度:每个区域的份额取决于它最近运行的实例数,需要超出份额的区域会在几秒内得到其他区域没有用到的部分(在此期间,它的请求会送到应用在另一个区域的机器上)。这些限制是配额,不是预留:一个区域的机器满了时,即使还在限制之内,新实例也可能被拒绝。
在哪里运行
应用运行在它指定的区域中(regions:na、eu、ap;默认三个都有)。请求在它进入的区域中、由那里为应用提供服务的机器响应;只有那里没有机器能响应时,才由另一个区域接手。min_instances 和 max_instances 按每个区域计算。参见区域。
规格
size 是 {vcpus, memory_bytes}:至少 1 vCPU 和 128 MiB,内存必须是偶数 MiB(即机器内存加载时所用的 2 MiB 页的整数倍;否则会被拒绝,400 invalid_field),最大为套餐允许的最大实例(免费版为 2 vCPU 和 4 GiB,付费版为 8 vCPU 和 16 GiB)。不设置时为 2 vCPU 和 4 GiB。在命令行上写作 --vcpus 4 --memory-bytes 8GiB。规格是版本的一部分:修改它会部署一个新版本。