docs: plan worker control plane session runtime
Some checks are pending
ci / test (ubuntu-latest) (push) Waiting to run
ci / test (windows-latest) (push) Waiting to run
ci / race (push) Waiting to run
ci / integration (push) Waiting to run

This commit is contained in:
youfak 2026-07-31 10:19:30 +08:00
parent a92deb9def
commit 081e172970
2 changed files with 1317 additions and 10 deletions

File diff suppressed because it is too large Load Diff

View File

@ -95,9 +95,15 @@ Cluster slot。
- `checksum` - `checksum`
- `expires_at` - `expires_at`
引用按 `(ownership_epoch, version)` 严格单调前进。相同 tuple 只允许使用
相同 checksum 幂等续期;同 tuple 更换 checksum 或倒退 tuple 均原子失败。
发布新引用会覆盖旧引用。旧版本 ACK 必须失败Worker 后续通过完整 Snapshot 重同步。 发布新引用会覆盖旧引用。旧版本 ACK 必须失败Worker 后续通过完整 Snapshot 重同步。
Snapshot payload 不在本轮写入 Redis下一轮会评估 payload 存储和流式分发方式。 Snapshot payload 不在本轮写入 Redis下一轮会评估 payload 存储和流式分发方式。
全局 ownership epoch 是 namespace 内的持久单调标量,不跟随 ownership TTL
过期。既有 namespace 在首次控制面读取或下次 Assign/Renew 时移除该 key
的历史 TTL避免 epoch 回退产生 ABA。
## 4. Session 状态机 ## 4. Session 状态机
Session 有以下状态: Session 有以下状态:
@ -116,6 +122,13 @@ Session 有以下状态:
| 空或非空 Runtime | 空或非空 Runtime
+--------------------> [续期] +--------------------> [续期]
| |
| 对新 Snapshot 的负向 ACK
v
[保留旧 ACKRuntime 已禁用]
|
| 后续有效正向 ACK
+--------------------> [已 ACK可接收 Runtime]
|
| 新 instance 注册 / TTL 过期 | 新 instance 注册 / TTL 过期
v v
[失效] [失效]
@ -125,7 +138,8 @@ Session 有以下状态:
1. 每次成功注册都生成新的 128-bit 加密随机 Session ID。 1. 每次成功注册都生成新的 128-bit 加密随机 Session ID。
2. 同一 `worker_id` 再注册会替换旧 Session并删除旧 Runtime 报告。 2. 同一 `worker_id` 再注册会替换旧 Session并删除旧 Runtime 报告。
3. 注册后的 `acked_snapshot_version``acked_ownership_epoch` 均为零。 3. 注册后的 `acked_snapshot_version`、`acked_ownership_epoch` 和
`acked_checksum` 均为零值,`runtime_enabled=false`。
4. Runtime 只有在 Session 已完成正向 ACK 后才可接受。 4. Runtime 只有在 Session 已完成正向 ACK 后才可接受。
5. 空 Runtime 报告表示完整稀疏计数全部为零,同时承担心跳并续期 Session。 5. 空 Runtime 报告表示完整稀疏计数全部为零,同时承担心跳并续期 Session。
6. Session 到期后,旧实例的 ACK 和 Runtime 均失败;使用该报告计算容量时保持 6. Session 到期后,旧实例的 ACK 和 Runtime 均失败;使用该报告计算容量时保持
@ -134,7 +148,9 @@ Session 有以下状态:
`supported_protocol_version` 本轮只接受 `1`。`worker_id` 与 `instance_id` 使用 `supported_protocol_version` 本轮只接受 `1`。`worker_id` 与 `instance_id` 使用
`[A-Za-z0-9][A-Za-z0-9._-]{0,127}``zone` 为空或使用同一字符集且最长 128 字节。 `[A-Za-z0-9][A-Za-z0-9._-]{0,127}``zone` 为空或使用同一字符集且最长 128 字节。
标签最多 32 个,键最长 64 字节、值最长 256 字节,规范化后的键值总长度最多 标签最多 32 个,键最长 64 字节、值最长 256 字节,规范化后的键值总长度最多
4 KiB禁止重复键、空键和首尾空白。 4 KiB禁止空键和首尾空白。`labels` 在 protobuf 契约中是 map重复 wire key
在进入 Service 前已按 protobuf map 语义归一化为最后一值Service 只验证
解码后的唯一键集。
## 5. RPC 行为 ## 5. RPC 行为
@ -155,12 +171,19 @@ Session 有以下状态:
ACK 操作在 Redis Lua 的一个原子边界内完成: ACK 操作在 Redis Lua 的一个原子边界内完成:
1. Session 必须存在、未过期,并匹配 worker/session。 1. Session 必须存在、未过期,并匹配 worker/session。
2. version、ownership epoch 和 checksum 必须匹配当前已发布 SnapshotReference。 2. 先按 tuple 与 Session 已 ACK 上界比较,再与当前已发布
3. `applied=true`ACK 只能严格前进或完全相同地幂等重放;成功后续期 Session SnapshotReference 比较。落后 tuple 是 stale ACK超前 tuple 或同 tuple
并清除旧 Runtime。 不同 checksum 是 Snapshot mismatch。
3. `applied=true`ACK 只能严格前进或完全相同地幂等重放。严格前进
时清除旧 Runtime、保存新上界并设置 `runtime_enabled=true`;相同 ACK
且 Runtime 已开启时只续期 Session不清除 Runtime 或 sequence/digest fence。
若相同 ACK 上界因先前负向 ACK 处于禁用状态,则清理残留 Runtime
并重新开启。
4. `applied=false` 是已接受的负向 ACK续期当前 Session但不推进 ACK 上界、 4. `applied=false` 是已接受的负向 ACK续期当前 Session但不推进 ACK 上界、
不保留旧 Runtime也不持久化自由文本错误下一轮 Snapshot Stream 据此继续 不保留旧 Runtime设置 `runtime_enabled=false`,也不持久化自由文本错误;
发送完整 Snapshot。 下一轮 Snapshot Stream 据此继续发送完整 Snapshot。只有后续正向 ACK
才把 `runtime_enabled` 重新设为 true因此负向 ACK 后延迟到达的旧 Runtime
不能重建已清除的报告与 sequence fence。
5. 旧版本、错误 checksum、超前版本或被替换 Session 均不修改状态。 5. 旧版本、错误 checksum、超前版本或被替换 Session 均不修改状态。
`error_code` 只接受有界枚举风格字符串;`error_message` 只做长度校验,不写日志或 `error_code` 只接受有界枚举风格字符串;`error_message` 只做长度校验,不写日志或
@ -171,9 +194,10 @@ ACK 操作在 Redis Lua 的一个原子边界内完成:
处理顺序: 处理顺序:
1. 校验 Session、报告序号、时间戳、计数非负、Proxy ID 唯一和批次上限。 1. 校验 Session、报告序号、时间戳、计数非负、Proxy ID 唯一和批次上限。
2. Snapshot version 与 ownership epoch 必须精确等于 Session 已 ACK 上界。 2. Session 必须 `runtime_enabled=true`,且 Snapshot version 与 ownership epoch 必须
3. 相同 sequence 和相同规范化内容是幂等重放;较小 sequence 拒绝;相同 sequence 精确等于 Session 已 ACK 上界。
不同内容判定冲突。 3. 相同 sequence 和相同规范化内容是幂等重放,但仍必须续期 Session
与报告 TTL较小 sequence 拒绝;相同 sequence 不同内容判定冲突。
4. 成功报告完整替换该 Worker 的稀疏 Runtime并续期 Session 与报告 TTL。 4. 成功报告完整替换该 Worker 的稀疏 Runtime并续期 Session 与报告 TTL。
5. 返回 Controller 当前 ownership epoch本轮 `revoke_proxy_ids` 为空。 5. 返回 Controller 当前 ownership epoch本轮 `revoke_proxy_ids` 为空。
@ -211,6 +235,8 @@ controlPlane:
- `tls.mode` 只允许 `disabled``mtls` - `tls.mode` 只允许 `disabled``mtls`
- `disabled` 只允许回环地址;非回环监听必须使用 `mtls` - `disabled` 只允许回环地址;非回环监听必须使用 `mtls`
- `mtls` 必须提供 server cert、server key、client CA、trust domain 和 environment。 - `mtls` 必须提供 server cert、server key、client CA、trust domain 和 environment。
- trust domain 必须是无 port 的小写 DNS 名environment 必须是单个有界 URI
path segment。
mTLS Worker 身份使用 URI SAN mTLS Worker 身份使用 URI SAN