Wire Protocol v1(M4a)
Coordinator ↔ worker。TCP 上的一行一个 JSON(NDJSON),一个连接一个请求。 这是 M4a 的批处理协议;remote wire / cell ownership 的协议在 M4b 另立。
1. 传输
- TCP;coordinator 主动连接 worker。
- 请求:一行 UTF-8 JSON +
\n。 - 响应:一行 UTF-8 JSON +
\n;随后关闭连接。 - 超时:coordinator 默认 30s(
flow distribute)/ 5s(node ping)。 - 无 TLS(M4a);生产需 mTLS + token。
2. Request
type Request =
| { type: "ping"; token?: string }
| { type: "run"; id: string; token?: string; spec: FlowSpec }
| { type: "run_chunk"; id: string; token?: string; spec: FlowSpec;
checkpoint?: Checkpoint; max_steps: u64 }
| { type: "stats"; token?: string };
run.spec:FlowSpec v1(见specs/flow-spec.md)。id:调用方生成;原样回传,用于关联。
3. Response
type Response =
| { type: "pong"; worker: string; version: 1 }
| { type: "result"; id: string; worker: string; result: FlowResult }
| { type: "chunk"; id: string; worker: string; result: FlowResult;
checkpoint: Checkpoint; done: boolean }
| { type: "error"; id?: string; worker: string; error: string }
| { type: "stats"; worker: string; jobs: u64; failures: u64; uptime_secs: u64 };
result:FlowResult(含 steps/state_hash/outputs/ledger/log)。error:鉴权失败、内部错误、非法 spec 等。stats.jobs:已处理 run 请求数;failures:其中 error 数。
4. 鉴权
- worker 配置
token后,所有请求必须带相同token。 - 缺失/错误 →
{"type":"error","error":"unauthorized: bad or missing token"}。 - M4a 是共享 secret;M4b 换成 capability token + mTLS。
5. 放置与重试
- coordinator 按 job index 轮询节点:
node = nodes[(start + attempt) % len]。 - 失败(连接错误、超时、remote error)→ 尝试下一个节点,最多
retries次。 - 结果按输入顺序返回;
JobOutcome.attempts记录尝试次数。 - worker 端无状态:每个
run从FlowSpec重新构建 runtime;幂等由调用方/FlowSpec 保证。
checkpointed chunks(M4b)
run_chunk:worker 构建 runtime;若有checkpoint则restore_checkpoint,然后最多跑max_steps步。- 返回
chunk:result+ 新checkpoint+done。 - coordinator 循环:把上一个 chunk 的 checkpoint 发给下一个 worker(round-robin),直到
done。 - 失败重试:同一 checkpoint 在另一个 worker 上重跑;不需要从头开始。
- coordinator 聚合各 chunk 的
result.log,最终JobOutcome.result.log是完整 trace。 Checkpoint含 agents/inbox/outputs/ledger/state_hash;worker 恢复后校验 state hash。
6. 限制(M4a)
- 静态成员:节点列表由 CLI/配置提供;无 gossip/心跳自动发现。
- 无 remote wire / cell ownership;任务粒度为整个 flow。
- 无迁移/检查点续跑;失败重试从头跑。
- 无 TLS/mTLS;只有共享 token。
- 无背压/租户配额;并发由 coordinator 线程数控制。
7. 版本
version: 1(pong.version)。- 新增可选字段 → minor;改变语义 → major。
- 测试:
crates/ain-sched/tests/distributed.rs。