开源的 Durable Objects 替代来了,冲着锁死 5 年的 Cloudflare Durable Objects 去的

Thomas 和 Olivier 在 Hacker News 上发了条 Show HN,做了个叫 Durable Actors 的开源项目——相当于 Cloudflare Durable Objects 的开源版。这是个 actor 模型:每个 actor 就是一台一次只处理一个请求的小服务器,自带 SQLite 数据库,全世界只有一份实例,通过名字寻址。这个原语典型的用处是部署多人在线 Agent:每个 Agent 一个 Durable Actor,每个用户用 websocket 连上来,可以完全水平扩展,不用去抢中央数据库和 websocket 服务器的资源。

做这个的动机是,Cloudflare Durable Objects 是市面上唯一的同类选择,但锁得太死。CF 的 DO 会连带绑上 D1、R2 和 Workers,而且这玩意 5 年前发布的时候根本没考虑 agentic 工作负载。OpenInspect、RampInspect、Liveblocks、PartyKit 这些项目都建在 Durable Objects 上,现在可以在 Durable Actors 上重建。

Durable Actors 完全开源,MIT License,带一个 helm chart 可以直接自托管。几个关键特性:可配置计算,用装饰器指定 CPU、RAM、数据驻留位置、空闲超时;不需要外层 worker,生成一个类型安全的客户端直接插进现有技术栈;今天上线的 SQLite 表导出,通过 CLI 和 MCP 把 OLTP 日志暴露给 Agent 调试。

性能数字都是 p95:durable write 85.6ms,状态读(SQLite 里的数据)2.14ms,actor 冷启动 334ms。官网还有个 counter demo 可以自己试试延迟。

评论区有几处交锋。有人拿来和 Azure Durable Functions、Temporal、AWS Lambda Durable Functions 比,Thomas 很快厘清了一个常见误区:Durable Actors 管的是 durable state,不是 durable execution。前者每个 actor 有自己的 SQLite,一次跑在一台主机上,客户端通过 RPC 或 websocket 改状态,actor 把变更推给所有客户端,更像 CF Durable Objects 或 Orleans;后者那些(Temporal、Azure Durable Functions)管的是执行编排。至于 Durable Entities,状态模型类似,但不支持 websocket 处理。

然后是对性能的质疑。有人拿 Deno 社区的 celld 出来比,说 celld 的 durable write 能到 1ms,100ms 的写延迟「只能当玩具」。Thomas 的回应是,celld 在 single node 场景下 durable write 也是 90ms,它靠在同一台 VPS 里配置小集群,用弱一致性的代价换快写;而 Durable Actors 会开放持久性保证的调节开关,把这个权衡交给用户自己管。

这段来回比较有趣,因为两边说的不是同一件事:一个强调绝对延迟,一个强调一致性权衡的透明度。评论区还有人对 actor 模型的状态查询这个老问题发难——状态都隔离在各自主键的 SQLite 里,业务查询怎么办?是不是还得在另一个库里再存一份?Thomas 承认这是他们当前最想解决的点,早期版本先做定时导出,但「sync 到 data lake」才是他想认真做对的方向。

这个项目还很早期。评论区那些「100ms 写延迟不如 celld」的质疑,其实暴露了个更本质的问题:durable actor 模型的卖点根本不在单写延迟,而在省掉你在多智能体架构里为「数据竞争」「中央 DB 压力」「websocket 连接管理」反复造轮子的那段工程量。只是这个论点要等产品成熟度来兑现,现在光靠 24 分和 18 条评论还撑不住。值得关注,但别指望它现在就能替换掉你线上跑的 CF DO。

相关链接:
- GitHub 仓库:https://github.com/TerseAI/durable-actors
- 官网:https://www.useterse.ai/
- 延迟 demo:https://demo.useterse.ai/