一句话总结
OpenClaw 的架构基因是单实例长驻进程,我们试图把它改造成分布式系统,投入了大量人力验证后发现:这条路能走通,但成本远超预期。
1. 背景与目标
1.1 为什么要搞分布式
OpenClaw 原生是单实例架构------一个进程对应一个用户/一个飞书机器人。在企业级场景下:
-
多用户需要共享资源(skill、cron等)
-
高可用需要故障转移(Pod 挂了用户无感)
1.2 目标形态
用户 A ─┐ 用户 B ─┼─→ Load Balancer ─→ Pod A / Pod B(共享状态) 用户 C ─┘
任何 Pod 都能接续任何用户的对话,Pod 间状态完全对等。
2. 尝试改了什么(四个核心改造点)
2.1 源码二次开发:Session/Memory 存储上云
改造内容:
- 将 session-store.json、会话缓存、memory 文件从本地文件系统迁移到云存储
问题:
-
OpenClaw 没有任何外部存储抽象层,所有状态都是
文件 + 进程内内存 -
打包后的源码(混淆/压缩)可读性极差,改造成本高
2.2 关闭磁盘持久化,Skills 改自建技能市场
改造内容:
-
关闭 K8s Pod 的磁盘持久化
-
将原本本地安装的 skill 改为从自建技能市场按需拉取
-
每次 Pod 重启/部署,从市场重新下载 skill 文件
丢失的能力:
-
❌ 重启后 workspace 内所有文件丢失
-
❌ 口头调整的 skill 无法持久化
-
❌ 安装的 CLI 工具包每次要重装
-
❌ 临时文件、下载缓存全部清空
问题:
-
启动时间显著增加(拉取 skill + 安装依赖)
-
离线/网络抖动场景下部署失败
-
技能市场本身成为新的单点
2.3 关闭内置 Cron,定时信息外部存储
改造内容:
-
禁用 OpenClaw 内置的 cron 调度器
-
将定时任务定义存储到外部(moonserver)
-
用外部调度器(如 K8s CronJob、外部定时服务)替代
问题:
-
内置 cron 与 OpenClaw 的 session 上下文深度耦合(systemEvent 注入)
-
外部调度器无法访问 OpenClaw 的内部会话状态\
2.4 其他文件状态丢失
已知受影响的状态:
-
飞书 OAuth 授权 token(单实例存储,重启即失效)
-
用户偏好设置
-
工具调用结果缓存
-
梦境/反思等 memory 系统数据
-
HEARTBEAT.md 等运行时状态文件
3. 核心发现:架构基因不匹配
3.1 OpenClaw 的设计假设
1 个进程 = 1 个用户 = 1 个飞书机器人 = 1 个完整状态
所有状态都是本地文件 + 进程内内存 ,没有任何外部存储抽象。这不是"没做完",而是设计选择------OpenClaw 从一开始就是为单实例场景设计的。
3.2 我们想要的
N 个进程 = N 个用户共享 = 任何 Pod 都能接手 = 状态外部化
这本质上是要把一个单机应用 改造成分布式系统。
3.3 根本矛盾
| 维度 | OpenClaw 设计 | 分布式需求 | 冲突 |
|---|---|---|---|
| 状态存储 | 本地文件系统 | 全局共享存储 | 架构层面困难 |
| 会话管理 | 进程内 Map | 分布式会话 store | 架构层面困难 |
| 定时调度 | 进程内 Timer | 集中式调度器 | 能解但有代价 |
| 工具缓存 | 进程内 LRU | 分布式缓存 | 能解但有代价 |
| OAuth Token | 本地加密文件 | 安全的秘密管理 | 架构层面困难 |
| Skill 加载 | 本地文件系统 | 制品仓库 | 能解但有代价 |
4. 投入与产出
4.1 投入的人力/资源
-
源码分析与逆向工程(打包 JS 的可读性极差)
-
存储层抽象改造(session、memory、cron、token 多个模块)
-
自建技能市场(前端 + 后端 + CLI)
-
外部调度系统搭建
-
反复的部署验证与问题排查
-
大量的讨论和方案设计时间
4.2 实际效果
-
✅ 验证了哪些能做、哪些不能做
-
✅ 深度理解了 OpenClaw 的内部架构
-
✅ 技能市场本身是有价值的基础设施
-
❌ 分布式状态共享效果不理想
-
❌ 重启后状态丢失问题未完全解决
-
❌ 系统复杂度显著增加
-
❌ 运维负担翻倍
5. 关键反思
5.1 分布式的代价被低估了
分布式不是"把文件放到共享存储"那么简单:
-
一致性:多个 Pod 同时读写同一用户的状态,谁说了算?
-
延迟:每次状态读写都多一次网络往返,LLM 推理本身已经很慢
-
复杂度:故障模式指数级增长(网络分区、脑裂、部分失败)
-
调试:单机调试 vs 分布式调试,完全是两个量级
5.2 验证本身是有价值的
虽然结果不理想,但这次验证明确了:
-
OpenClaw 能 跑在 K8s 里,但不能以分布式模式跑
-
单实例 + 持久卷是目前最务实的部署方式
-
如果真要分布式,需要从 OpenClaw 的架构层开始改,不是应用层能解决的
6. 方向建议
回归单实例 + 持久卷
-
恢复磁盘持久化,重启不丢状态
-
Skill 装在本地,启动快
-
内置 cron 正常使用
-
运维简单,问题少
-
代价:弹性伸缩能力受限,但对当前规模够用