如果您熟悉 Workers,Workers for Platforms 引入了四个关键组件:分派命名空间(dispatch namespaces)、动态分派 Worker(dynamic dispatch Workers)、用户 Worker(user Workers),以及可选的出站 Worker(outbound Workers)。
分派命名空间是一个容器,用于容纳您所有客户的 Worker。您的平台获取客户编写的代码,然后发出 API 请求将该代码作为用户 Worker 部署到命名空间(例如 staging 或 production)。与 Workers 相比,这提供了:
- 无限制的 Worker 数量 - 命名空间中的 Worker 不受每个账户脚本限制的约束
- 默认隔离 - 命名空间中的每个用户 Worker 都在不受信任的模式下运行 —— 即使用户 Worker 运行在同一个 Cloudflare 区域(zone)上,也从不共享缓存,并且无法访问
request.cf对象 - 动态调用 - 您的动态分派 Worker 可以使用
env.DISPATCHER.get("worker-name")调用命名空间中的任何 Worker
动态分派 Worker 是对您平台所有请求的入口点。您的动态分派 Worker:
- 路由请求 - 根据主机名、路径、标头或任何其他标准确定哪个客户 Worker 应该处理每个请求
- 运行平台逻辑 - 在客户代码运行之前执行身份验证、速率限制或请求验证
- 设置每客户限制 - 根据计划类型对 CPU 时间和子请求强制执行自定义限制
- 清理响应 - 修改或过滤来自客户 Worker 的响应
动态分派 Worker 使用分派命名空间绑定 来调用用户 Worker:
export default {
async fetch(request, env) {
// Determine which customer Worker to call
const customerName = new URL(request.url).hostname.split(".")[0];
// Get and invoke the customer's Worker
const userWorker = env.DISPATCHER.get(customerName);
return userWorker.fetch(request);
},
};用户 Worker 包含您的客户编写的代码。您的客户将其代码发送到您的平台,然后您发出 API 请求代表他们部署用户 Worker。用户 Worker 部署到分派命名空间,并由您的动态分派 Worker 调用。您可以为用户 Worker 提供绑定 以访问 KV、D1、R2 和其他 Cloudflare 资源。
出站 Worker 会拦截用户 Worker 发出的 fetch() 请求。用它来:
- 控制出口 - 阻止或允许来自客户代码的外部 API 调用
- 记录请求 - 跟踪客户调用的外部服务
- 修改请求 - 添加身份验证标头或在请求离开您的平台之前对其进行转换
- 请求到达您的动态分派 Worker(例如,
customer-a.example.com/api) - 您的动态分派 Worker 确定哪个用户 Worker 应该处理该请求
- 动态分派 Worker 调用
env.DISPATCHER.get("customer-a")以获取用户 Worker - 用户 Worker 执行。如果它发出外部
fetch()调用并配置了出站 Worker,这些请求将首先通过出站 Worker。 - 用户 Worker 返回一个响应
- 您的动态分派 Worker 可以选择在返回响应之前修改它
Workers for Platforms 和 服务绑定 都支持 Worker 之间的通信。当您确切知道哪些 Worker 需要通信时,请使用服务绑定。当您的客户动态上传用户 Worker 时,请使用 Workers for Platforms。
您可以同时使用两者 - 您的动态分派 Worker 可以使用服务绑定调用内部服务,同时也可以分派到命名空间中的用户 Worker。