Skip to content

Queue And Reliability

队列与并发

默认部署:serverAPI + embedded worker 模式运行。需拆分时使用 server --api-only + 独立 worker

队列原则

  • 一个 session 一条逻辑队列
  • 一个 session 同时只有一个 worker 持锁执行
  • 不同 session 可并发

当前实现

能力 状态
同 session 串行执行 done
embedded worker 模式 done
Redis 队列/锁(无 Redis 时退回 in-process) done
heartbeat 落库 done
分布式可靠性(串行 + 取消 + 超时 + heartbeat + stale run 回收) partial
启动时扫描 heartbeat 过期 run 并回收 partial

建议做法

  • Redis list / stream 保存 session 队列
  • Redis lock 控制 session 执行权
  • PostgreSQL 记录 run 最终状态
  • history.db 异步 mirror sync,不进入主调度链路

为什么不用单纯数据库锁:高频调度效率低、分布式扩展不自然、实时队列可观测性差。

取消、超时与恢复

取消

  • API 取消 run → worker 检查取消标记 → shell 子进程发终止信号 → 外部调用 best-effort cancellation

超时

类型 状态
run 总超时 done
单次工具调用超时 done
hook 超时(不阻断 run,发通知事件) done
单次模型调用超时 partial(hook 层有,主模型流以 run 总超时为主)

恢复

能力 状态
基于 heartbeat 的启动恢复扫描 done
stale run 标记为 failed(fail-closed) done
自动重新排队 / 续跑 missing

本地历史镜像

同步原则

  • PostgreSQL 是唯一事实源
  • .openharness/data/history.db 是单向异步镜像
  • 镜像同步失败不影响 run 执行

做法

中心库写入时追加 history event → 独立 syncer 按 workspace_id + event_id 拉增量 → 本地 SQLite 幂等 upsert → 推进同步游标。

恢复

  • syncer 从 last_event_id 继续
  • 镜像缺失可从头回放
  • 镜像损坏可删除重建

故障边界

故障 影响
中心库 在线请求
Redis 调度
本地镜像 仅备份和离线检视

当前边界

  • 生产执行:已具备取消、run/tool 超时、hook 非阻断超时通知
  • worker 崩溃后 run 卡住:不会,stale run 在后续 worker 启动时回收为失败态
  • worker 崩溃后 run 自动续跑:不能,需外部编排或人工重试