目前,容器只能通过使用唯一 ID 调用 BINDING.get()
手动扩展,然后
启动容器。除非在容器类上将 manualStart
设置为 true
,否则每个
实例会在调用 get()
时启动。
// 获取 3 个容器实例env.MY_CONTAINER.get(idOne)env.MY_CONTAINER.get(idTwo)env.MY_CONTAINER.get(idThree)
每个实例将运行,直到其 sleepAfter
时间过期,或直到手动停止。
这种行为在您希望对容器实例的生命周期进行明确控制时非常有用。 例如,您可能希望为特定用户启动容器后端实例,或者您可能短暂 运行代码沙箱来隔离 AI 生成的代码,或者您可能希望运行短期批处理作业。
但是,有时您希望运行容器的多个实例并轻松地将请求路由到它们。
目前,实现这一点的最佳方法是使用 临时 getRandom
辅助函数:
import { Container, getRandom } from "@cloudflare/containers";
const INSTANCE_COUNT = 3;
class Backend extends Container { defaultPort = 8080; sleepAfter = "2h";}
export default { async fetch(request: Request, env: Env): Promise<Response> { // 注意:"getRandom" 将在不久的将来被延迟感知路由替换 const containerInstance = getRandom(env.BACKEND, INSTANCE_COUNT) return containerInstance.fetch(request); },};
我们提供了 getRandom 函数作为路由到多个无状态容器实例的临时解决方案。 它将为每个请求随机选择 N 个实例中的一个并路由到它。不幸的是,它有两个主要缺点:
- 它要求用户设置要路由到的固定实例数。
- 它将随机选择每个实例,无论位置如何。
我们计划在不久的将来通过内置的自动扩展和路由功能解决这些问题。
您将能够通过在容器类上设置 autoscale
属性来为容器开启自动扩展:
class MyBackend extends Container { autoscale = true; defaultPort = 8080;}
这指示平台根据传入流量和资源使用情况(内存、CPU)自动扩展实例。
容器实例将自动启动以服务本地流量,并在不再需要时停止。
要将请求路由到正确的实例,您将使用 getContainer()
辅助函数获取容器实例,然后
将请求传递给它:
export default { async fetch(request, env) { return getContainer(env.MY_BACKEND).fetch(request); },};
这将向最近的就绪容器实例发送流量。如果容器过载或尚未启动, 请求将路由到可能更远的容器。容器就绪状态可以根据 资源使用情况自动确定,但也可以通过自定义就绪检查进行配置。
自动扩展和延迟感知路由将在不久的将来可用,并在发布时提供更详细的文档。
在此之前,您可以使用 getRandom
辅助函数将请求路由到多个容器实例。
- @2025 Cloudflare Ubitools
- Cf Repo