OpenClaw做分布式合适吗?

一句话总结

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 验证本身是有价值的

虽然结果不理想,但这次验证明确了:

  1. OpenClaw 跑在 K8s 里,但不能以分布式模式跑

  2. 单实例 + 持久卷是目前最务实的部署方式

  3. 如果真要分布式,需要从 OpenClaw 的架构层开始改,不是应用层能解决的


6. 方向建议

回归单实例 + 持久卷

  • 恢复磁盘持久化,重启不丢状态

  • Skill 装在本地,启动快

  • 内置 cron 正常使用

  • 运维简单,问题少

  • 代价:弹性伸缩能力受限,但对当前规模够用

相关推荐
IT王师傅13 天前
从 豆包 到 Codex CLI:一名普通开发者的 AI 工具进化路线
ai·codex cli·openclaw
AC赳赳老秦16 天前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw
风吹夏回16 天前
RabbitMQ 核心术语 + Python pika 方法完整讲解
分布式·python·rabbitmq
七夜zippoe16 天前
OpenClaw 消息系统:多平台消息收发深度解析
消息·message·多平台·openclaw·imessage
风吹夏回16 天前
RabbitMQ 三种模式入门:HelloWorld、WorkQueue、PubSub
分布式·rabbitmq·ruby
霸道流氓气质16 天前
分布式追踪与 RequestId 传播完全指南
分布式
cheems952716 天前
[RabbitMQ高级特性] 消息确认机制:从 Ready / Unacked 到 basicAck、basicReject、basicNack 的底层拆解
分布式·rabbitmq·ruby
盼小辉丶16 天前
Ubuntu极速部署OpenClaw完全指南(本地模型+DeepSeek)
linux·ubuntu·openclaw
枫华落尽17 天前
【Hadoop01-完全分布式运行模式】
分布式
隔壁阿布都17 天前
ShedLock 分布式定时任务锁框架介绍
spring boot·分布式