Chapter 01

Cloudflare 边缘架构

Cloudflare 不是另一家"廉价 AWS"——它的核心是把计算、存储、数据库一起搬到了距离用户最近的 PoP。理解这件事之前,你写出的 Worker 只会像个远方的 HTTP 函数。

边缘的真正含义

"Edge Computing"被用得太泛。Cloudflare 的边缘非常具体:全球 330+ 城市的 PoP,每个 PoP 都能运行你的代码、读你的数据库、缓存你的对象。不是"有几个节点加速",是一整套运行时。

┌─────────────────────── 传统部署 ────────────────────────┐ │ 用户(东京)──500ms──> 源站(弗吉尼亚) │ └─────────────────────────────────────────────────────────┘ vs ┌─────────────────────── Cloudflare ──────────────────────┐ │ 用户(东京)──10ms──> 东京 PoP(Worker + D1 副本 + KV) │ │ │ │ │ └── 异步同步到其他 PoP │ └─────────────────────────────────────────────────────────┘

V8 Isolate:不是容器,也不是 FaaS

Lambda/Vercel Functions 等 FaaS 用容器或 microVM 隔离,每次冷启动要启一个进程,耗时 100-500ms。Workers 用的是 V8 的 Isolate——一个进程里装上千个相互隔离的 JS 环境。

模型隔离单位冷启动内存代表
容器Linux cgroup200-2000ms128MB+Lambda
microVMFirecracker100-500ms128MB+Fly.io
V8 IsolateJS context< 5ms3MB 起Workers
代价
Isolate 必须跑 V8 能跑的东西——JavaScript / TypeScript,编译后的 WebAssembly。没有文件系统,没有原生 Node API,没有 child_process。用这套模型,写 Python/Go 就要走 WASM(Python Workers 2024 可用,背后就是 WASM)。

Anycast 路由

你部署一次 Worker,Cloudflare 自动把它推到所有 PoP。用户请求通过 Anycast IP 到达最近的 PoP,由那个 PoP 执行。不需要你配置区域、不需要负载均衡——路由是 BGP 级别的事。

用户(上海)  ──DNS──>  cloudflare.com
                              │
                       BGP Anycast
                              │
            ┌─────────────────┼─────────────────┐
            ▼                 ▼                 ▼
       上海 PoP          东京 PoP           法兰克福 PoP
       (被路由到)       (未被选)           (未被选)

Cloudflare 产品矩阵

Workers
无服务器 JS/TS/WASM 运行时。每个请求启动一个 Isolate,执行完回收。
Pages
静态 + Functions 的一体化部署。Git 推送即上线,Preview 环境免费。2025 已与 Workers 合并为统一平台。
D1
边缘 SQLite——基于 libSQL,主区域可写,多区域只读副本。适合多读少写场景。
R2
S3 兼容对象存储,零出口费。静态资产、数据湖、媒体文件的好去处。
KV
全球最终一致键值库。读快(每 PoP 本地缓存),写最终一致(秒级传播)。
Durable Objects
单例 Actor,全局唯一位置,强一致存储。WebSocket 协同、游戏房间、速率限制的"脚"。
Queues
消息队列,Producer/Consumer 都是 Worker。至少一次投递,支持批处理与 DLQ。
Workers AI
在边缘调 Llama / Mistral / Whisper 等开源模型,按 token 计费,免自部署。
Vectorize
边缘向量数据库,与 Workers AI 嵌入模型搭档,做 RAG。

计算模型的三个关键约束

1. CPU 时间,不是 wall-clock

Workers 按 CPU 时间计费(Free 10ms、Paid 30s)。await fetch() 等 IO 的时间不算 CPU。这是它能便宜的原因——十万个请求同时在 await,都只算一个 Worker 在"存在"。

export default {
  async fetch(req) {
    // fetch() 的等待不算 CPU 时间
    const [a, b] = await Promise.all([
      fetch('https://api.a.com'),
      fetch('https://api.b.com'),
    ]);
    return new Response('ok');
  },
};

2. 无文件系统、无长连接

Worker 是请求作用域的。每次请求起一个 Isolate(或复用现有的),请求结束后状态可能消失。任何"全局缓存""连接池"想法要重新思考——答案通常是 KV 或 Durable Object。

3. 子请求数量有限

一个请求内最多 50 个子 fetch()(Paid 1000)。这强迫你把逻辑想清楚,别在一个请求里循环调 100 次外部 API。

什么场景适合 Cloudflare

场景Cloudflare 合适度
高并发低延迟 API(用户遍布全球)✅ 主场
静态站 + 动态 API(Jamstack)✅ Pages 完美
协同编辑 / 实时 WebSocket✅ DO 强项
AI 推理网关 / RAG✅ Workers AI + Vectorize
海量对象存储(数据湖、视频库)✅ R2 零出口费
重度 CPU 任务(视频编码、ML 训练)❌ 超 CPU 限额
需要 Linux 原生二进制(ffmpeg CLI)⚠️ 编 WASM 或走 Container Services
传统 RDBMS(Postgres with WAL)⚠️ 用 Hyperdrive 代理外部 PG

免费额度(2026)

对个人项目、Demo、初创,这套免费额度已经能跑到"被媒体报道"的量级。

一个心智模型

把 Cloudflare 想成一个分布式操作系统:

┌──────────────────────────────────────────┐ │ Cloudflare "OS" │ ├──────────────────────────────────────────┤ │ 进程模型: Workers (V8 Isolate) │ │ 文件系统: R2 (对象) + D1 (关系) │ │ IPC / 队列: Queues │ │ Actor / 锁: Durable Objects │ │ 内存缓存: KV / Cache API │ │ 定时任务: Cron Triggers │ │ 异步编排: Workflows │ │ GPU: Workers AI │ │ 索引服务: Vectorize │ └──────────────────────────────────────────┘

这一章理解完,后面每一章都是在"这个操作系统上"装一个系统级能力。

本章小结