Deno celld 深度解读:自托管分布式 Durable Objects,把 Cloudflare Workers 搬回家

如果你曾经用过 Cloudflare Durable Objects,一定对它的强一致性、单线程执行模型和按名寻址爱不释手。但托管服务的成本在规模化后往往令人头疼——每个常驻对象 $4.15/月,1000 个就是 $4150+。Deno Land 创始人 Ryan Dahl 最近开源了一个项目 celld,让你在自己的机器上跑 Durable Objects,成本降到原来的 1/80。

项目概览

celld 是一个开源守护进程,可以在你自己的服务器上运行 Cloudflare Workers 和 Durable Objects。每个对象(cell)都是一个独立的 SQLite 数据库,按名寻址,自动复制到你自己的 S3 兼容存储桶中。节点之间仅通过存储桶协调——没有控制面,没有共识协议,没有成员管理。

  • GitHub 地址:github.com/denoland/celld
  • 官网:celld.dev
  • 今日 Stars:516+(总 2,228+)
  • 语言:Rust
  • 许可证:Apache-2.0
  • 二进制大小:58 MB(静态编译)

核心设计理念

celld 的架构可以用一句话概括:存储桶即协调器。传统分布式系统通常需要 Zookeeper、etcd 或 Raft 共识协议来管理节点成员和领导者选举。celld 的做法截然不同:

  1. 每个 cell 是一个 SQLite 数据库:应用天然按 cell 分片,不存在单数据库的争用和爆炸半径问题
  2. 所有权通过 S3 的原子写入(Compare-and-Swap)来声明:不需要成员协议,不需要故障检测器,不需要共识服务
  3. 持续复制:每个 cell 的 SQLite 状态以 LTX(Litestream 格式)增量段的形式持续复制到存储桶
  4. 故障恢复:节点宕机后,另一个节点从存储桶获取租约,恢复 SQLite 数据库,在秒级内恢复执行
  5. 休眠机制:空闲 cell 自动休眠,不占用内存和 CPU,唤醒只需约 4ms

celld 是对 Cloudflare Durable Objects 设计理念的一封情书——这个原语太好了,值得在任何地方运行。

性能数据

指标 数值
无状态请求 P50 / P99 0.2ms / 0.3ms
无状态吞吐(每 Worker 线程) ~94,000 req/s
休眠 cell 唤醒 ~4ms
每个常驻 cell RAM 4 MB
8 GB 节点可容纳常驻 cell ~1,000 个
确认写入丢失(RPO) 0
持久化写入延迟(区域本地) ~90ms
节点故障恢复 ~20s
每月每常驻 cell 成本 ~$0.05

对比 Cloudflare Durable Objects 的 $4.15/cell-month,celld 在单个 8GB 节点上运行 1000 个 cell 的成本仅约 $48/月(DigitalOcean 定价),相当于每个 cell 不到 $0.05/月,成本降低约 80 倍

快速上手

1. 安装 celld

一行命令安装静态编译的二进制文件(支持 Linux x86-64 和 ARM64):

# 从官网下载安装脚本后执行(详见 https://celld.dev)
# 支持 Linux x86-64 和 ARM64,仅 58MB

安装器会将二进制放到 ~/.local/bin,并用独立版本目录管理,支持原子切换和验证卸载。

2. 准备 S3 兼容存储桶

推荐使用 Cloudflare R2(免费额度充足),也支持任何 S3 兼容服务:AWS S3、MinIO、Backblaze B2 等。创建一个空存储桶即可。

3. 部署项目

celld deploy . --bucket s3://my-cells-bucket --endpoint https://ACCOUNT.r2.cloudflarestorage.com

celld deploy 会自动调用 esbuild 编译 Worker 代码,支持 Wrangler 配置的子集,包括共同部署的静态资源。

4. 启动节点

celld --bucket s3://my-cells-bucket --endpoint https://ACCOUNT.r2.cloudflarestorage.com --region auto --listen 0.0.0.0:8080 --advertise node-a.internal:8080

多个节点指向同一个存储桶即可自动组成集群。节点之间通过存储桶发现彼此所有权,无需额外的服务发现。

5. 使用 Docker 运行

docker volume create celld-state
docker run --rm --network host -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e CELLD_WATCH=/var/lib/celld/state -v celld-state:/var/lib/celld ghcr.io/denoland/celld --bucket s3://my-cells-bucket --listen 0.0.0.0:8080 --advertise node-a.internal:8080

安全与运维

  • 节点间通信:Peer HTTP 不终结 TLS,需要部署在受信任的私有网络或加密覆盖网络(WireGuard/Tailscale)中。公网 IP 会被默认拒绝,除非显式指定 --unsafe-public-advertise
  • 认证:首个节点会在存储桶中创建 fleet/peer-auth.json,后续所有节点间请求都会用该密钥进行 HMAC 签名和重放保护。
  • 诊断工具celld diagnose --bucket s3://my-cells-bucket 可以枚举所有节点租约,探测每个活跃节点,报告过期记录、不可达节点、协议不兼容等问题,并展示每个节点的 cell 数量、WebSocket 连接、内存、CPU 等指标。
  • 压力卸载:支持设置常驻 cell 的高/低水位线,在压力下自动复制并释放最少使用的空闲 cell,并在水位线以下重新接收新 cell。

适用场景

  1. 实时协作应用:多人文档编辑、白板、聊天室——每个房间是一个 cell,状态天然隔离
  2. 游戏服务器:每个游戏房间独立的状态管理,宕机自动恢复
  3. IoT 设备管理:每台设备一个 cell,管理连接状态和消息队列
  4. 分布式任务队列:天然分片,worker 崩溃不影响其他任务
  5. 边缘计算/私有云:在自有服务器上部署,数据不出域,满足合规要求
  6. 开发和测试:本地运行完整的 Workers/Durable Objects 环境,接近零成本

当前限制

celld 目前仍处于早期阶段(PR 已关闭,提交通过邮件发送 patch),有几个需要注意的限制:

  • 运行环境和兼容性表面仍在演变中
  • 不支持完整 Workerd 所有 API(兼容列表见 celld.dev/docs/cloudflare-compat
  • Node.js compat 模块处于早期支持阶段
  • 正式发布前不建议用于生产环境

总结

celld 代表了一个重要的趋势:Cloudflare Workers/Durable Objects 编程模型的去中心化。它继承了一个优秀的分布式编程原语——单线程对象 + 自带存储 + 按名寻址——然后把控制权还给了开发者。你的数据在你自己的存储桶里,你的节点运行在你自己的机器上,出问题时你可以直接用 sqlite3 和 grep 排查,而不是对着一个状态页面干瞪眼。

对于追求成本优化、数据主权和运维透明度的团队来说,celld 是一个值得持续关注的项目。虽然目前还不适合生产环境,但它展示的技术路线——用 S3 作为分布式系统唯一的协调器——本身就值得每一位后端开发者深入学习。

项目地址:https://github.com/denoland/celld

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享