developers.cloudflare.com/workers/reference/how-workers-works · Cloudflare Docs · 页面最后更新 2026-04-23

Cloudflare Workers 工作原理图解:三个差异讲透「为什么无状态」

Workers 代码长得像浏览器或 Node.js 的 JavaScript,但运行模型完全不同——代码跑在 Cloudflare 全球网络,每个运行时实例里塞满 V8 isolateV8 引擎的轻量执行上下文:有自己的堆内存和全局状态,是进程内的沙箱。。官方文档把差异归纳成三根支柱:isolate请求驱动计算分布式执行。看懂这三件事,就懂了整个 Cloudflare agent 技术栈的地基。

官方 Reference · 基础层面向:想搞懂 isolate 凭什么便宜、Worker 为什么无状态的读者

一、三根支柱:一张图看懂全貌

① Isolates V8 轻量沙箱 · 执行单元 一个进程跑成百上千个 内存完全隔离 启动快 ~100 倍 内存少一个数量级 便宜 · 快 · 密集 ② Compute per Request 请求驱动 · 触发模型 请求 → fetch() → Response 无请求 → 无运行 无常驻进程 大部分 Worker 的默认形态 用多少 · 算多少 ③ Distributed Execution 调度现实 · 无粘性 请求不保证同一实例 单线程事件循环 async 等待时可穿插处理 全局状态不可依赖 执行是瞬时的
三大支柱同时定义了 Workers 的能力与边界:isolate 让它便宜,请求驱动让它无常驻,分布式执行让它必须无状态。

二、Isolate:V8 的轻量沙箱

isolate 是 V8 引擎编排的轻量上下文——给你的代码提供可访问的变量和一个安全的执行环境,本质上就是函数级沙箱。一个 Workers 运行时实例可以跑成百上千个 isolate 并无缝切换,每个 isolate 的内存完全隔离,互不干扰、互不可信。它不创建虚拟机,而是在已有环境里直接创建,因此消除了 VM 模型的冷启动

Traditional architecture 进程 +运行时 进程 +运行时 进程 +运行时 进程 +运行时 每个函数一个进程 每进程一份完整运行时开销 Workers V8 isolates 一个进程 · 运行时开销只付一次 几乎无限个脚本 · 单脚本零额外开销 User code Process overhead
复刻官方对比图:传统 serverless 每个函数一个容器化进程、每份运行时开销;Workers 把运行时开销付一次,上面跑海量 isolate。
官方给的两个数字

① 任何 isolate 的启动比容器/VM 上的 Node 进程快约 100 倍;② 启动时内存少一个数量级。这就是「isolate 撑得起数亿并发 agent」这句判断的算术基础。

为什么能做到:开销在哪一次付清

其他 serverless 供应商用容器化进程,每个进程各跑一个语言运行时——函数越多,运行时副本越多。Workers 把 JavaScript 运行时的一次性开销放在容器启动时付清,之后进程内创建 isolate 只是「隔出一个上下文」,几乎不增加个体开销。

三、isolate 不保证长寿:别在全局存状态

isolate 有自己独立的作用域,但驱逐Eviction:isolate 被关闭并从机器上移除。运行时会等事件妥善处理完才驱逐,但你的代码不保证活着。是常态而不是事故——它随时可能被关闭。官方明确建议:不要在全局作用域存可变状态,除非你已经为这个意外做了预案。

创建 毫秒级 · 快 ~100x 内存少一个数量级 运行 内存完全隔离 请求期间连续可用 可能被驱逐 事件处理完才关闭 不保证长寿 驱逐的三种常见原因 机器资源紧张 Resource limitations 可疑脚本 试图逃逸沙箱 个人资源限额 Individual limits 结论:全局可变状态 = 随时会丢
isolate 快而便宜,代价是「活着」不被保证——这是 Workers 无状态编程模型的物理根源。

四、请求驱动计算:一个 fetch handler 走天下

大部分 Worker 都是同一个默认流程的变体:请求到达 Cloudflare 任意数据中心,调用你导出的 fetch() handler,返回 Response没有请求就没有运行——没有常驻进程、没有启动/停止的仪式。

客户端 Cloudflare 全球网络 你的 Worker ① HTTP 请求 *.workers.dev / 托管域名 ② 任意数据中心 调用 fetch(request, env, ctx) 处理 · 返回 Response ③ Response 返回网络 ④ 响应送回客户端 请求进来才算 · 算完就走
ES modules 语法下,请求驱动模型只有一个入口:fetch handler。
export default {
  async fetch(request, env, ctx) {
    return new Response('Hello World!');
  },
};

五、分布式执行:无粘性 + 单线程事件循环

像所有 JavaScript 平台一样,单个 Worker 实例用单线程事件循环处理多个请求——await 异步任务(比如 fetch)期间,其他请求可能被穿插处理。但关键在调度:任何两个请求都不保证路由到同一个实例,也不保证不同。所以全局状态既不可靠、也不可共享。

请求 A 请求 B 请求 A′ Cloudflare 全球网络 不保证粘性:同一请求的两次访问可能不同实例 也可能回到同实例 实例 1 · 单线程事件循环 任务 A 运行中 await fetch… 等待期间 穿插处理其他请求 (可能,也可能不) 事件处理完才驱逐 isolate 实例 2 · 单线程事件循环 任务 B 运行中 await fetch… 等待期间 穿插处理其他请求 两个实例间没有共享内存 也看不到对方的全局状态
分布式执行 = 同一个 Worker 代码在全球无数实例上跑,每个实例都是一个独立的小世界。
官方红线:不要使用或修改全局状态

不是因为规范不允许,而是因为没有粘性保证:这次请求在实例 1,下次可能在实例 2,甚至两个请求同时在两个实例上跑。全局变量既不可靠(可能不存在)也不安全(可能并发被改)。需要状态?把它放到有持久身份的载体里。

六、对 agent 技术栈意味着什么

这份参考文档的价值在于:它把「Worker 无状态」从一句口头禅变成了可追溯的物理事实。而 Cloudflare 的 agent 基础设施,本质上是把「状态」从 Worker 里搬出来,放进专门的位置:

普通 Worker 瞬时执行体 请求来了才跑 · 无身份 全局状态随时会丢 Durable Object 有持久身份与状态的 isolate 同一 ID 永远路由到同一实例 空闲休眠 · 醒来状态还在 @cloudflare/computer workspace 虚拟文件系统 挂在 DO 上 · 持久 isolate / container 双后端 执行与状态分离 = Cloudflare 的默认模型 agent 的连续性住在 DO 的持久身份里,不靠 Worker 实例本身
三根支柱的推论链:Worker 无状态 → 状态需要家 → DO 是家 → workspace 把「计算机」也放进去。
一句话带走

isolate 让执行便宜到可以随手创建,请求驱动让执行只在需要时发生,分布式执行让执行无法被依赖——所以 Cloudflare 把「连续性」从执行体里拿出来,放进了 DO 与持久存储。这正是「serverless agent」叙事在平台层的地基。

来源:How Workers works · Cloudflare Docs(Workers · Reference)· 页面最后更新 2026-04-23