跳转到内容
搜索文档

Workers for Platforms 是如何工作的

最后更新 查看 MarkdownAgent 设置

架构

如果您熟悉 Workers,Workers for Platforms 引入了四个关键组件:分派命名空间(dispatch namespaces)、动态分派 Worker(dynamic dispatch Workers)、用户 Worker(user Workers),以及可选的出站 Worker(outbound Workers)。

Workers for Platforms 架构

分派命名空间

分派命名空间是一个容器,用于容纳您所有客户的 Worker。您的平台获取客户编写的代码,然后发出 API 请求将该代码作为用户 Worker 部署到命名空间(例如 stagingproduction)。与 Workers 相比,这提供了:

  • 无限制的 Worker 数量 - 命名空间中的 Worker 不受每个账户脚本限制的约束
  • 默认隔离 - 命名空间中的每个用户 Worker 都在不受信任的模式下运行 —— 即使用户 Worker 运行在同一个 Cloudflare 区域(zone)上,也从不共享缓存,并且无法访问 request.cf 对象
  • 动态调用 - 您的动态分派 Worker 可以使用 env.DISPATCHER.get("worker-name") 调用命名空间中的任何 Worker

动态分派 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

用户 Worker 包含您的客户编写的代码。您的客户将其代码发送到您的平台,然后您发出 API 请求代表他们部署用户 Worker。用户 Worker 部署到分派命名空间,并由您的动态分派 Worker 调用。您可以为用户 Worker 提供绑定 以访问 KV、D1、R2 和其他 Cloudflare 资源。

部署与管理流程

出站 Worker(可选)

出站 Worker 会拦截用户 Worker 发出的 fetch() 请求。用它来:

  • 控制出口 - 阻止或允许来自客户代码的外部 API 调用
  • 记录请求 - 跟踪客户调用的外部服务
  • 修改请求 - 添加身份验证标头或在请求离开您的平台之前对其进行转换
Outbound Worker 出口控制模式

请求生命周期

  1. 请求到达您的动态分派 Worker(例如,customer-a.example.com/api
  2. 您的动态分派 Worker 确定哪个用户 Worker 应该处理该请求
  3. 动态分派 Worker 调用 env.DISPATCHER.get("customer-a") 以获取用户 Worker
  4. 用户 Worker 执行。如果它发出外部 fetch() 调用并配置了出站 Worker,这些请求将首先通过出站 Worker。
  5. 用户 Worker 返回一个响应
  6. 您的动态分派 Worker 可以选择在返回响应之前修改它

Workers for Platforms 与服务绑定

Workers for Platforms 和 服务绑定 都支持 Worker 之间的通信。当您确切知道哪些 Worker 需要通信时,请使用服务绑定。当您的客户动态上传用户 Worker 时,请使用 Workers for Platforms。

您可以同时使用两者 - 您的动态分派 Worker 可以使用服务绑定调用内部服务,同时也可以分派到命名空间中的用户 Worker。

这篇文档对您有帮助吗?