Workers 代码长得像浏览器或 Node.js 的 JavaScript,但运行模型完全不同——代码跑在 Cloudflare 全球网络,每个运行时实例里塞满 V8 isolateV8 引擎的轻量执行上下文:有自己的堆内存和全局状态,是进程内的沙箱。。官方文档把差异归纳成三根支柱:isolate、请求驱动计算、分布式执行。看懂这三件事,就懂了整个 Cloudflare agent 技术栈的地基。
isolate 是 V8 引擎编排的轻量上下文——给你的代码提供可访问的变量和一个安全的执行环境,本质上就是函数级沙箱。一个 Workers 运行时实例可以跑成百上千个 isolate 并无缝切换,每个 isolate 的内存完全隔离,互不干扰、互不可信。它不创建虚拟机,而是在已有环境里直接创建,因此消除了 VM 模型的冷启动。
① 任何 isolate 的启动比容器/VM 上的 Node 进程快约 100 倍;② 启动时内存少一个数量级。这就是「isolate 撑得起数亿并发 agent」这句判断的算术基础。
其他 serverless 供应商用容器化进程,每个进程各跑一个语言运行时——函数越多,运行时副本越多。Workers 把 JavaScript 运行时的一次性开销放在容器启动时付清,之后进程内创建 isolate 只是「隔出一个上下文」,几乎不增加个体开销。
isolate 有自己独立的作用域,但驱逐Eviction:isolate 被关闭并从机器上移除。运行时会等事件妥善处理完才驱逐,但你的代码不保证活着。是常态而不是事故——它随时可能被关闭。官方明确建议:不要在全局作用域存可变状态,除非你已经为这个意外做了预案。
大部分 Worker 都是同一个默认流程的变体:请求到达 Cloudflare 任意数据中心,调用你导出的 fetch() handler,返回 Response。没有请求就没有运行——没有常驻进程、没有启动/停止的仪式。
export default {
async fetch(request, env, ctx) {
return new Response('Hello World!');
},
};
export default {
async fetch(request, env, ctx): Promise<Response> {
return new Response('Hello World!');
},
} satisfies ExportedHandler<Env>;
像所有 JavaScript 平台一样,单个 Worker 实例用单线程事件循环处理多个请求——await 异步任务(比如 fetch)期间,其他请求可能被穿插处理。但关键在调度:任何两个请求都不保证路由到同一个实例,也不保证不同。所以全局状态既不可靠、也不可共享。
不是因为规范不允许,而是因为没有粘性保证:这次请求在实例 1,下次可能在实例 2,甚至两个请求同时在两个实例上跑。全局变量既不可靠(可能不存在)也不安全(可能并发被改)。需要状态?把它放到有持久身份的载体里。
这份参考文档的价值在于:它把「Worker 无状态」从一句口头禅变成了可追溯的物理事实。而 Cloudflare 的 agent 基础设施,本质上是把「状态」从 Worker 里搬出来,放进专门的位置:
isolate 让执行便宜到可以随手创建,请求驱动让执行只在需要时发生,分布式执行让执行无法被依赖——所以 Cloudflare 把「连续性」从执行体里拿出来,放进了 DO 与持久存储。这正是「serverless agent」叙事在平台层的地基。
来源:How Workers works · Cloudflare Docs(Workers · Reference)· 页面最后更新 2026-04-23