自建 Workers:绑定层比 V8 更重要
后端约 5 分钟阅读

自建 Workers:绑定层比 V8 更重要

OpenWorkers 一类项目把讨论拉回完整平台。自建关键是有身份的绑定、隔离与配额,而不是把 JS 跑起来。

cover

Cloudflare Workers 的开发体验已经把一批后端习惯改成了「isolate + 绑定」:没有长进程心态,配置即能力,KV / R2 / 队列 / 定时器用声明接上。最近开源侧又冒出 OpenWorkers 一类项目——用自建基础设施跑 V8 isolate,对齐全套平台能力(面板、调度、日志、KV、对象存储、Postgres 绑定),而不是只复刻一个 fetch handler。HN 讨论里反复出现同一句话:运行时能跑 JS 只是起点,绑定层才是产品。

如果你在评估「要不要自建一层 Workers」,先别比 benchmark 海报,先画绑定与信任边界。

人们真正羡慕的是绑定,不是 V8

业务代码常见长这样:

ts
export default {
  async fetch(req: Request, env: Env) {
    const id = new URL(req.url).searchParams.get("id");
    const row = await env.DB.prepare(
      "select id, title from notes where id = ?"
    ).bind(id).first();
    if (!row) return new Response("not found", { status: 404 });
    await env.CACHE.put(`note:${id}`, JSON.stringify(row), {
      expirationTtl: 60,
    });
    return Response.json(row);
  },
};

这里好看的不是 JavaScript,而是 env.DB / env.CACHE 作为平台注入的能力句柄:权限在部署时收窄,密钥不进仓库,本地与线上用同一套抽象。自建若只做到「容器里跑 Node 监听 3000」,你省下的是账单幻觉,不是这套模型。

OpenWorkers 路线强调的完整栈大致是:

  • isolate 运行时(rusty_v8 等)
  • 声明式绑定:KV、S3/R2、Postgres、cron
  • 控制面:部署、日志、调度、仪表盘
  • 单机 docker-compose 可起的开发路径

缺控制面的「类 Workers」最后都会退化成又一个 PaaS 半成品。

自建时的三道题

1. 多租户隔离停在哪一层

Workers 模型吸引人的地方之一是:不信任的用户代码也能跑(至少在云厂商的威胁模型里如此)。自建若面向内部自动化,威胁模型不同;若面向外部插件 / 客户脚本,就必须回答:

  • isolate 之间共享哪些内核资源
  • 出站网络默认策略(allowlist 还是全开)
  • 文件系统、环境变量、时钟、随机数是否可被滥用
  • 一个租户的死循环如何影响邻居

「能跑 untrusted JS」写在 README 很容易,生产里要有杀进程、配额、CPU 时间片和出站代理。

2. 绑定是 RPC 还是进程内假象

KV / SQL 绑定若只是进程内随便 new 一个客户端,权限边界会漏:用户代码一旦能读到连接串,绑定就沦为语法糖。更稳的形状是:

  • 用户代码只见能力接口(get/put/query)
  • 真正的凭证留在主机侧 agent
  • 每条绑定调用带上部署身份与审计 id

Postgres 绑定尤其危险。给 isolate 一条宽权限连接,等于把 SQL 注入面和数据面直接交给模型生成的字符串。至少按部署注入只读角色,或强制参数化 API,禁止任意 SQL 字符串。

3. 冷启动与长任务别自欺

Isolate 擅长短请求。一有「跑五分钟的 Agent 循环」,你就会想念队列、工作器和可恢复检查点。自建平台若只提供 fetch,团队会把长任务硬塞进请求里,然后在网关超时处开会。

健康切分:

工作负载 去处
鉴权、BFF、webhook isolate fetch
定时对账、薄 ETL cron 触发 + 短任务
Agent 多步工具调用 队列 + worker,状态外置
大文件转换 独立作业系统,不进 isolate

和「直接上 Node 服务」怎么选

不是所有后端都该 Workers 化。

选 isolate 平台的信号:

  • 多租户短函数、按请求计费心态
  • 希望配置绑定代替到处传密钥
  • 边缘或近数据的轻逻辑

继续普通服务的信号:

  • 重 CPU、长连接、强会话
  • 需要精细的原生扩展 / GPU
  • 团队没有精力养控制面

还有第三条路:托管 Workers + 自建「重」服务,用队列衔接。不要为了统一架构把批处理塞进 isolate。

图:控制面、isolate 与绑定主机的分工

若你准备试点 OpenWorkers 类方案

建议按这个顺序,而不是先搬全部 API:

  1. 单绑定竖切:只接 KV 或只接 Postgres 只读,跑一个内部工具。
  2. 部署身份:每个脚本独立身份,默认无出站,再按域名放行。
  3. 日志与配额:没有 per-deploy 的 CPU/时间/日志检索,就不要谈生产。
  4. 本地一致性:开发者 compose up 后应能用同一 env 形状调试,否则绑定抽象留不住。
  5. 退出策略:绑定接口后留一层自己的 port,避免业务代码直接锁死某一自建实现。

厂商 Workers 的护城河,一大半在绑定生态与全球调度。自建能追的是可控与数据驻留;追「全球 300+ 城冷启动」会先把运维拖垮。

小结

自建 Workers 的关键不是把 V8 跑起来,而是把绑定做成有身份、有审计、有配额的能力接口,并坦白哪些负载不该进 isolate。OpenWorkers 这类项目把讨论拉回完整平台:面板、调度、存储绑定和运行时要一起看。若你只是想少管服务器,托管仍然更省寿命;若你有合规或插件沙箱硬需求,再为绑定层付钱和付时间。运行时会收敛,绑定设计会留下技术债——先把债借在正确的地方。

相关文章