feat: add durable Worker execution and WSS server
This commit is contained in:
@@ -2,6 +2,8 @@
|
||||
|
||||
> 版本 0.2 · 2026-09-17。HTTP + WS 已确认。本文的具体路径、消息名、字段及状态码是首版设计建议,业务协议尚未实现,需评审后冻结;健康接口的已实现契约见接口手册。
|
||||
|
||||
实现更新:HTTP 任务/队列接口已完成 P1;Worker 服务端已进入 P2,实际帧名、字段、回执与边界见 [Worker 契约](api/worker.md)。本文保留早期完整设计,未实现项目不能据此视为已交付。
|
||||
|
||||
## 1. 通用契约
|
||||
|
||||
- 生产使用 HTTPS / WSS;HTTP 承担任务提交、流程启动与信号、查询、管理,WS 承担 Worker 双向通信与结果订阅。
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
- `model/`:ID、摘要、JSON、命名空间记录等公共原语。
|
||||
- `platform/model/`:应用、命名空间、凭据、幂等、事件、订阅交付及审计。
|
||||
- `pulse/model/`:队列、执行门控、会话、任务、尝试、回执、并发许可和调度计划。
|
||||
- `pulse/model/`:队列、执行门控、进程/会话、任务、尝试、回执、迟到证据、并发许可和调度计划。
|
||||
- `weave/model/`:定义及不可变版本、实例、步骤激活、等待、信号、查询轮次与恢复记录。
|
||||
- `internal/storage/mysql/`:连接、事务与显式迁移,不向 SDK 暴露。
|
||||
- `sdk/go/`:独立 Go module;对外 DTO 与服务端模型分别维护。
|
||||
@@ -34,7 +34,7 @@
|
||||
|
||||
## 3. 实体清单
|
||||
|
||||
下表与初始迁移中的 30 个实体一致;迁移自身另有 `orbit_schema_migrations` 记录。
|
||||
当前共 32 个实体:初始迁移包含 30 个,000003 增加进程会话头和迟到证据。迁移自身另有 `orbit_schema_migrations` 记录。
|
||||
|
||||
| 模块 | Go 模型 | 数据表 |
|
||||
| --- | --- | --- |
|
||||
@@ -49,9 +49,11 @@
|
||||
| pulse | `Queue` | `pulse_queues` |
|
||||
| pulse | `ExecutionGate` | `pulse_execution_gates` |
|
||||
| pulse | `WorkerSession` | `pulse_worker_sessions` |
|
||||
| pulse | `WorkerInstance` | `pulse_worker_instances` |
|
||||
| pulse | `Task` | `pulse_tasks` |
|
||||
| pulse | `Attempt` | `pulse_attempts` |
|
||||
| pulse | `AttemptReceipt` | `pulse_attempt_receipts` |
|
||||
| pulse | `AttemptEvidence` | `pulse_attempt_evidence` |
|
||||
| pulse | `ConcurrencyLimit` | `pulse_concurrency_limits` |
|
||||
| pulse | `Permit` | `pulse_permits` |
|
||||
| pulse | `Schedule` | `pulse_schedules` |
|
||||
@@ -86,6 +88,8 @@
|
||||
|
||||
外键与 `CHECK` 无法代替执行引擎。P1 已完成 HTTP 动作/队列授权、幂等摘要与原回执、受理事件,以及待执行取消的 CAS/审计事务。执行相关的以下条件继续分阶段实现:
|
||||
|
||||
P2 服务端已新增会话隔离、两步派发、租约、并发许可、结果回执/证据和恢复扫描,见 [执行协议](api/worker.md) 与 [阶段记录](reports/phase-2-server.md)。Worker SDK 和完整 P2 验收仍在推进。
|
||||
|
||||
1. 权限验证、凭据校验、命名空间过滤和队列消费授权。
|
||||
2. 同一次事务更新任务、尝试、租约、并发许可、事件与流程交付记录。
|
||||
3. CAS 竞争、数据库时间校验、门控与开始授权串行化。
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
| --- | --- | --- | --- |
|
||||
| P0 基础与数据模型 | Go workspace、独立 SDK module、公共/Pulse/Weave 模型、MySQL 迁移、配置、健康检查 | 编译/竞态/静态检查;真实 MySQL 建表、隔离、唯一性、预算、不可变版本、迁移失败防护;SDK 健康调用 | 已完成并通过阶段回归(见 P0 报告) |
|
||||
| P1 任务受理闭环 | 应用凭据与作用域权限、队列、幂等提交、查询、待执行取消、受理事件;SDK 客户端 | API/SDK 创建查询闭环;重复键与内容冲突、响应未确认重报、跨命名空间拒绝、参数边界 | 已完成并通过阶段回归(见 P1 报告;真实断路/提交 ACK 丢失注入留后续故障阶段) |
|
||||
| P2 Worker 执行闭环 | WSS 接入、能力/容量、领取与开始、租约、续租、结果确认、排空与恢复;Worker SDK | 真 Worker 执行;失联/重连/重复确认/旧尝试拒绝;业务效果未知转核查;节点故障接管 | 待开发 |
|
||||
| P2 Worker 执行闭环 | WSS 接入、能力/容量、领取与开始、租约、续租、结果确认、排空与恢复;Worker SDK | 真 Worker 执行;失联/重连/重复确认/旧尝试拒绝;业务效果未知转核查;节点故障接管 | 开发中:服务端执行事务和 WSS 已通过阶段内回归;Worker SDK 自动运行/重连/退出及完整验收待完成 |
|
||||
| P3 Pulse 完整能力 | 安全重试、延时、Cron/固定间隔、漏跑策略、计划版本、并发许可、配额/背压、可靠结果订阅 | 多实例领取/触发竞争、重试上限、取消竞争、队列隔离、积压恢复、事件重复交付 | 待开发 |
|
||||
| P4 Weave 主流程 | SDK 定义构建与发布校验、实例、顺序/分支/结构化并行汇合、信号/定时等待、版本绑定 | 重启接续、早到/重复信号、并行竞争、内部事件重放、发布版本兼容;端到端通用流程 | 待开发 |
|
||||
| P5 Weave 恢复与查询 | 有界查询、暂停继续、取消、人工核查恢复、控制门控与审计 | 轮次与尝试独立预算;暂停/开始/回执/超时竞争;恢复保留预算;未知结果不盲目重复 | 待开发 |
|
||||
@@ -73,3 +73,4 @@ SDK、文档与示例随 P1–P5 同步开发,P7 是全量核对,不是最
|
||||
- [生产验收总清单](05-production-acceptance.md)
|
||||
- [P0 验证记录](reports/phase-0.md)
|
||||
- [P1 验证记录](reports/phase-1.md)
|
||||
- [P2 服务端阶段记录](reports/phase-2-server.md)
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
- 文档版本:0.2
|
||||
- 整理日期:2026-09-17
|
||||
- 阶段:P0 模型基础与 P1 任务受理/SDK 已实现,平台完整功能按持续计划开发;尚未完成生产验收
|
||||
- 阶段:P0/P1 已完成,P2 服务端执行/WSS 已通过阶段内回归,Worker SDK 继续开发;尚未完成生产验收
|
||||
- 适用范围:Orbit 统一平台,包含 Pulse 任务调度模块、Weave 流程编排模块与公共能力。平台面向多个业务系统复用。
|
||||
|
||||
## 阅读顺序
|
||||
@@ -79,4 +79,4 @@ Orbit 不内置特定行业规则;Pulse 管理执行,Weave 管理步骤依
|
||||
|
||||
2026-09-17,文档更新至 0.2:用户确认研发定义发布流程及 Weave 首版功能,明确纳入有界重复查询和暂停/继续等生产管理能力。技术细则与参数继续按建议或待定标注,未将功能确认等同于实现或验收通过。
|
||||
|
||||
持续开发目标已建立。当前实现和验收进度以 [开发计划](08-development-plan.md)、[P0 报告](reports/phase-0.md)、[P1 报告](reports/phase-1.md) 为准;早期设计稿中的“未实现”描述保留其编写阶段语境。
|
||||
持续开发目标已建立。当前实现和验收进度以 [开发计划](08-development-plan.md)、[P0 报告](reports/phase-0.md)、[P1 报告](reports/phase-1.md)、[P2 服务端记录](reports/phase-2-server.md) 为准;早期设计稿中的“未实现”描述保留其编写阶段语境。
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
| `/v1/tasks` 提交、查询、分页与待执行取消 | P1 已实现 | [任务接口](tasks.md) |
|
||||
| `/v1/queues` 创建与查询 | P1 已实现 | [队列接口](queues.md) |
|
||||
| 凭据校验与初始化 CLI | P1 已实现 | [鉴权](authentication.md) |
|
||||
| `/v1/worker/connect` | 计划 P2,尚未实现 | [协议草案](../03-http-websocket-protocol.md) |
|
||||
| `/v1/worker/connect` | P2 服务端已实现,Worker SDK 仍在开发 | [Worker 契约](worker.md) |
|
||||
| `/v1/schedules` 与计划管理 | 计划 P3,尚未实现 | [协议草案](../03-http-websocket-protocol.md) |
|
||||
| `/v1/events/connect` | 计划 P3,尚未实现 | [协议草案](../03-http-websocket-protocol.md) |
|
||||
| `/v1/workflows` 与流程管理 | 计划 P4–P5,尚未实现 | [流程接口规划](workflows.md) |
|
||||
|
||||
@@ -51,3 +51,5 @@ actions 不支持通配符;queues 可列出队列 ID,星号仅表示当前
|
||||
原始秘密错误、凭据撤销/过期、应用或命名空间停用统一返回 401。合法身份缺少动作权限返回 403。读取不在范围内的单个资源返回 404,避免披露资源内容。
|
||||
|
||||
SDK 使用 `orbit.Options{Token: token}`。健康查询不发送凭据。当前不启用业务权限缓存,撤销校验不依赖缓存过期。
|
||||
|
||||
P2 增加 workers:connect 和 workers:consume。bootstrap 只有显式提供 --worker-access 时才同时授予这两项开发权限;现有凭据不自动变化。Worker 还需独立的进程恢复秘密和尝试秘密,见 [Worker 契约](worker.md)。
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
状态:P1 已实现并通过真实 MySQL 与 SDK 回归。当前提供受理、查询、分页和待执行取消;Worker 执行与自动重试在 P2–P3 实现。
|
||||
|
||||
P2 进展:服务端执行内核和 WSS 已可产生 LEASED、RUNNING、SUCCEEDED、FAILED、NEEDS_REVIEW 等状态,见 [Worker 契约](worker.md);独立 Worker SDK 仍在开发,自动策略重试尚未完成。
|
||||
|
||||
## 公共约定
|
||||
|
||||
业务接口需要 `Authorization: Bearer <token>`;写入需要 `Content-Type: application/json` 和稳定的 `Idempotency-Key`。凭据决定命名空间,请求体不能覆盖它。详见 [鉴权与初始化](authentication.md)。
|
||||
|
||||
146
docs/api/worker.md
Normal file
146
docs/api/worker.md
Normal file
@@ -0,0 +1,146 @@
|
||||
# Worker 通信与执行契约 v1(开发中)
|
||||
|
||||
已实现服务端执行事务、WebSocket 接入和真实 WSS 回归。**P2 尚未完成**:独立 Go SDK 的 Worker 运行器、自动重连/续租、处理器生命周期与优雅退出还在开发。本页记录当前可验证的服务端契约,不把测试客户端当作可交付 Worker SDK。
|
||||
|
||||
## 1. 接入与身份
|
||||
|
||||
入口 `GET /v1/worker/connect`,子协议必须为 `pulse.worker.v1`。Authorization 使用 Bearer 凭据;禁止 URL 查询参数。握手先校验 workers:connect,消费控制操作再次校验 workers:consume、队列范围和凭据有效性。
|
||||
|
||||
初始化开发凭据可显式增加 Worker 权限:
|
||||
|
||||
```sh
|
||||
go run ./cmd/orbit-admin bootstrap \
|
||||
--application worker-demo --namespace default --environment development \
|
||||
--queue objects --worker-access --output .local/worker.credentials.json
|
||||
```
|
||||
|
||||
默认 bootstrap 仍只有 P1 的五项权限,现有凭据不会自动扩权。生产细粒度凭据管理在 P6 完成。
|
||||
|
||||
当前 orbit 命令监听 HTTP,开发可使用 ws;生产需要受控的 TLS 终止。WSS 回归使用真实 TLS 测试服务器及受信任测试证书,没有跳过证书校验。传输库锁定 github.com/coder/websocket v1.8.15,使用上下文、读写期限、子协议和默认 Origin 校验,关闭压缩。[上游版本记录](https://github.com/coder/websocket/releases/tag/v1.8.15)、[上游接口文档](https://pkg.go.dev/github.com/coder/websocket@v1.8.15)。
|
||||
|
||||
## 2. 帧格式
|
||||
|
||||
只接受 JSON 文本帧;单帧最多 512 KiB,业务结果最多 256 KiB。重复键、未知字段、无效 Unicode 和非法数值按 HTTP 相同规则拒绝。
|
||||
|
||||
```json
|
||||
{
|
||||
"protocol_version":"1",
|
||||
"type":"task.start",
|
||||
"message_id":"44444444444444444444444444444444",
|
||||
"session_id":"33333333333333333333333333333333",
|
||||
"body":{
|
||||
"task_id":"11111111111111111111111111111111",
|
||||
"attempt_id":"22222222222222222222222222222222",
|
||||
"epoch":"1",
|
||||
"lease_secret":"<执行秘密,仅通过受控连接传输>"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
所有 ID 为 32 位小写十六进制;epoch、sequence、revision 用十进制字符串。message_id 标识一次操作,重连重报保持不变;session_id 必须换为当前连接身份。服务端响应以 reply_to 关联请求:
|
||||
|
||||
```json
|
||||
{
|
||||
"protocol_version":"1",
|
||||
"type":"error",
|
||||
"message_id":"55555555555555555555555555555555",
|
||||
"reply_to":"44444444444444444444444444444444",
|
||||
"session_id":"33333333333333333333333333333333",
|
||||
"error":{"code":"LEASE_LOST","message":"attempt no longer grants execution authority"}
|
||||
}
|
||||
```
|
||||
|
||||
普通成功响应 type=ack,body 为下表对应结果。服务端主动派发 type=task.assign,无 reply_to。错误仅包含稳定分类和公开消息,不包含 SQL、业务参数或秘密。
|
||||
|
||||
## 3. 注册、恢复与容量
|
||||
|
||||
连接后 5 秒内必须发送 worker.hello,hello 不携带 session_id。
|
||||
|
||||
| hello 字段 | 含义 |
|
||||
| --- | --- |
|
||||
| instance_id | Worker 进程实例 ID;进程重启必须换新值 |
|
||||
| instance_secret | 32 字节随机秘密的无填充 base64url 编码,共 43 字符;同进程重连保留 |
|
||||
| queue_id | 当前进程绑定队列 |
|
||||
| capabilities | 1–32 个 handler / handler_version / payload_version 精确版本组合,不可重复 |
|
||||
| capacity | 总执行槽数量,1–256,不是可用槽的累加值 |
|
||||
|
||||
重连必须保持凭据、队列、处理器集合和进程秘密,处理器集合的排列顺序不影响身份。新连接递增会话代次并使旧会话失效。知道 instance_id 或 task_id 不能接管执行。
|
||||
|
||||
worker.welcome 返回 session_id、epoch、server_time、expires_at、lease_duration_ms、draining。当前窗口为会话 45 秒、执行租约最多 30 秒;注册及能力声明不等于开始授权。
|
||||
|
||||
**派发在收到第一次 worker.capacity 确认后才启用**,便于客户端先恢复旧尝试。
|
||||
|
||||
| 类型 | body | 返回 |
|
||||
| --- | --- | --- |
|
||||
| worker.resume | AttemptRef,字段见上方 task.start 示例 | 当前 LeaseStatus;成功迁移有效尝试到新会话,不创建尝试或延长期限 |
|
||||
| worker.capacity | sequence 字符串、capacity 0–256、drain bool | 更新后的 welcome 字段 |
|
||||
| task.assign | 服务端主动发送 | task 完整任务、attempt_id、epoch、lease_secret、lease_until、server_time |
|
||||
|
||||
capacity 使用单调递增序号和覆盖值。同序号同内容可重复,同序号不同内容或旧序号冲突;capacity=0 不释放已有任务的并发许可。drain=true 是进程级持久化排空,重连保留,不能通过后续消息清除;新进程使用新实例身份。
|
||||
|
||||
一个 Worker 进程当前绑定一个队列。可以运行多个 Worker 进程或后续 SDK 实例消费不同队列;不能通过重连静默切换队列。
|
||||
|
||||
## 4. 开始、续租与结果
|
||||
|
||||
| 类型 | body | 语义 |
|
||||
| --- | --- | --- |
|
||||
| task.start | AttemptRef | 领取后再次检查当前会话、尝试、租约、队列暂停及流程门控,保存 RUNNING 后确认 |
|
||||
| task.renew | AttemptRef | 只续期当前 RUNNING;新消息可续租,重复原消息只取回原回执 |
|
||||
| task.finish | ref: AttemptRef、outcome、result、error_code | 保存明确结果或未知效果;返回操作回执和当前授权 |
|
||||
|
||||
outcome 为 SUCCEEDED / FAILED / UNKNOWN。result 为非 null JSON 或证据引用。FAILED/UNKNOWN 必须带 1–64 字符的稳定 error_code;SUCCEEDED 不带错误分类。当前 FAILED 成为任务失败终态,UNKNOWN 转 NEEDS_REVIEW;策略化自动重试在 P3 实现。
|
||||
|
||||
开始、续租和结束返回 CommandResult:
|
||||
|
||||
```json
|
||||
{
|
||||
"receipt":{
|
||||
"operation":"start",
|
||||
"task_state":"RUNNING",
|
||||
"attempt_state":"RUNNING",
|
||||
"task_revision":"3",
|
||||
"lease_until":"2026-09-17T08:00:30Z",
|
||||
"disposition":"APPLIED"
|
||||
},
|
||||
"lease":{
|
||||
"active":true,
|
||||
"state":"RUNNING",
|
||||
"lease_until":"2026-09-17T08:00:30Z",
|
||||
"server_time":"2026-09-17T08:00:00Z"
|
||||
},
|
||||
"deduplicated":false
|
||||
}
|
||||
```
|
||||
|
||||
receipt 是原操作的不可变确认;lease 是本次重新核验的执行权,两者不能混用:
|
||||
|
||||
- 只有 lease.active=true、lease.state=RUNNING,且仍在保守的本地有效期内,才允许处理器推进。LEASED 的 active 只表示预占有效。
|
||||
- 原 start 回执可能仍表示 RUNNING,但当前 lease.active=false;旧 ACK 不能让已过期、已结束或已被替换的尝试复活。
|
||||
- 有效期不超过租约窗口、会话期限、任务总截止和从 authorized_at 起计算的单次尝试时限。
|
||||
- 客户端需要扣除请求总耗时及安全余量,用本地单调时钟停止执行,不能假定本地墙上时钟与数据库一致。
|
||||
- 同结果重报不重复释放许可或产生成功事件。同消息不同内容返回 IDEMPOTENCY_CONFLICT。
|
||||
- 迟到、未开始或与已保存结果冲突的内容,经过身份和秘密验证后保存为 EVIDENCE_ONLY;不改变任务权威结果,不当作新的执行授权。
|
||||
- 断线后原结果仍保留稳定消息 ID,可在新会话恢复/核对后重报。不会因重连创建第二次业务执行。
|
||||
|
||||
## 5. 领取、并发与回收
|
||||
|
||||
平台在同一事务中分配队列并发许可、创建尝试、递增任务执行代次和次数、保存 LEASED 与派发事件。领取本身消耗一次 max_attempts 预算,包括最终未获开始授权的尝试,预算不会因重连或过期恢复重置。
|
||||
|
||||
运行中的进程总容量跨其所有旧/新会话统计。声明容量减少、断开连接或重复结果,都不能重复释放额度。当前已实施队列 max_concurrency;rate_per_second、其他配额和调度策略在 P3 完成。
|
||||
|
||||
每个节点每 2 秒发起一批恢复扫描,每批最多 100 项:
|
||||
|
||||
- 未批准开始即到期:有剩余次数和截止时间时,延后 1 秒重派;否则 FAILED。
|
||||
- 已批准开始后失联:NEEDS_REVIEW,尝试 UNKNOWN,不能因网络超时断定业务未生效。
|
||||
- WAITING 超过总截止或最晚开始时间:FAILED。
|
||||
- 回收再次锁定队列、任务、尝试并读取数据库时间,与续租/完成串行化;多个节点不能重复释放许可或重复终结事件。
|
||||
|
||||
此处的安全回收不是完整重试引擎;IDEMPOTENT 的自动重试和策略退避仍是 P3 工作。
|
||||
|
||||
## 6. 连接保护与当前边界
|
||||
|
||||
当前节点上限 128 条 Worker 连接;每连接入站队列 4 帧、出站队列 8 帧,派发保留 ACK 缓冲空间,每秒最多发起 4 次新派发尝试。读空闲期限 60 秒、写期限 5 秒、单个数据库控制操作期限 8 秒。慢消费者导致连接关闭时,已提交状态仍由稳定身份恢复。
|
||||
|
||||
这些是有界的开发基线,不代表经过容量压测的生产参数。当前同队列操作使用较粗的行锁协调,吞吐与公平性需要 P6 按负载验证。服务退出会显式关闭被 HTTP Upgrade 接管的连接;断开不会直接撤销外部已发出的请求。
|
||||
|
||||
运行中取消、SDK 自动重连/续租、非协作处理器处理、完整 WS JSON Schema、凭据轮换和多节点进程级故障演练尚未全部完成。实际证据见 [P2 服务端阶段记录](../reports/phase-2-server.md)。
|
||||
@@ -13,7 +13,7 @@
|
||||
## 已可运行:文件转换任务的受理与取消
|
||||
|
||||
- 源码:[SDK 任务受理示例](../../sdk/go/examples/tasks/main.go)。
|
||||
- 前置:完成迁移、初始化凭据、启动服务,详见 [SDK 接入](../sdk/README.md)。
|
||||
- 前置:完成迁移、初始化凭据、启动服务,在没有 Worker 消费的专用队列运行此受理/取消示例,详见 [SDK 接入](../sdk/README.md)。
|
||||
- 输入:对象引用、格式与精确整数;提交两次同一身份,再查询、分页并带版本取消。
|
||||
- 预期:重复请求返回同一任务,最终 CANCELLED/revision=2。当前不启动 Worker,不实际生成文件。
|
||||
- 异常:凭据失效、权限不足、内容冲突、版本竞争和未知网络结果,见 [任务接口](../api/tasks.md)。
|
||||
|
||||
57
docs/reports/phase-2-server.md
Normal file
57
docs/reports/phase-2-server.md
Normal file
@@ -0,0 +1,57 @@
|
||||
# P2 服务端执行与 WSS 阶段记录
|
||||
|
||||
日期:2026-09-17。**这是 P2 的阶段内进展,不是 P2 或生产验收完成。**
|
||||
|
||||
## 实现
|
||||
|
||||
新增 WorkerInstance 与 AttemptEvidence,当前共 32 个持久化实体。字段、模型职责、单位、可空/秘密/代次语义及 SQL COMMENT 均为中文。新增前向迁移 000003_worker_execution,旧迁移不改写。
|
||||
|
||||
服务端现有能力包括进程恢复秘密、会话头与连接代次、能力绑定、容量覆盖和排空、两步领取/开始、尝试秘密、续租、结果回执、迟到证据、跨节点恢复,以及到期扫描。队列并发许可随执行事务领取、续期和释放。
|
||||
|
||||
HTTP 进程已注册 Worker WebSocket 入口,并启动受控恢复扫描;使用有界网络队列、消息/连接上限和明确的关闭流程。默认 bootstrap 不扩权,新增 --worker-access 显式为开发凭据增加 Worker 权限。
|
||||
|
||||
## 实际回归
|
||||
|
||||
环境:macOS arm64,Go 1.27.1,Docker 隔离 MySQL 8.4.10。入口为 make test、make vet、make build、make integration;数据库临时创建并清理,不使用已有业务数据库。
|
||||
|
||||
| 场景 | 结果 |
|
||||
| --- | --- |
|
||||
| 新迁移与全部 Go 模型字段匹配、前序 P0/P1 回归 | 通过 |
|
||||
| 开始/续租/结果确认的原消息重报 | 原回执可查,不重复执行状态变更或延长旧续租 |
|
||||
| 多消息提交同一已保存结果 | 只产生一次结果事件与审计、只释放一次许可 |
|
||||
| 精确整数与小数结果 | 保存与查询不损失数值内容 |
|
||||
| 不同节点重连与恢复同一尝试 | 原子迁移会话;次数和许可不增加 |
|
||||
| 旧会话、错误尝试秘密、错误进程证明、注册内容改变 | 拒绝 |
|
||||
| 两个实例、两个节点、16 个并发领取请求 | 队列并发 2、进程容量各 1 均不被突破 |
|
||||
| 重连时旧会话已有执行 | 不重置容量计数 |
|
||||
| 排空、容量零、重复/冲突序号 | 不给新工作,不误释放已有许可,排空跨重连保留 |
|
||||
| 前 18 个任务门控暂停,后面有普通任务 | 普通任务仍能被领取,无候选页饥饿 |
|
||||
| 暂停与开始、已授权开始回执、结果保存 | 未开始被阻止;已开始的原回执和结果仍可保存 |
|
||||
| 未开始到期、已开始失联、两个恢复节点竞争 | 有限重派/FAILED/NEEDS_REVIEW 正确;无重复释放 |
|
||||
| 迟到成功、未开始提交结果、冲突结果 | EVIDENCE_ONLY,保留证据,不改写权威结果 |
|
||||
| 原 start ACK 在结束或过期后重报 | receipt 保留,当前 lease.active=false |
|
||||
| 单次绝对时限与会话过期 | 续租不能越过限制,过期会话不能靠心跳复活 |
|
||||
| 获取锁之前进入请求、锁等待期间租约过期 | 不使用早先时钟样本批准开始 |
|
||||
| 领取事件或完成审计 INSERT 被注入失败 | 任务、尝试、许可、回执、事件整体回滚 |
|
||||
| 凭据撤销、跨命名空间、已取消 context | 执行控制拒绝 |
|
||||
| WSS 真 TLS 握手,鉴权/子协议/Origin/URL 规则 | 通过;使用受信任测试证书,不跳过验证 |
|
||||
| WSS 节点 A 派发开始 → 断开 → 节点 B 恢复 → 结果确认重报 | 同一尝试、一次成功事件、许可正确释放 |
|
||||
| 重复 JSON 字段、服务关闭与已接管长连接 | 非法帧关闭;节点关闭无残留长连接 |
|
||||
|
||||
WSS 测试客户端直接发送协议帧,并显式重连到另一个测试服务器。当前没有把这项测试说成 SDK 自动重连或真实主机宕机演练。两个 ExecutionStore/Hub 使用不同节点 ID、同一个真实数据库;它们位于同一测试进程。
|
||||
|
||||
## 事务与恢复约束
|
||||
|
||||
每条命令重新校验当前凭据。执行路径先锁进程头/会话,再锁队列、可选门控、任务、尝试;回收从队列开始,不反向锁 Worker。拿到相关锁后重新读取数据库时间。状态、回执、额度和事件在短事务内提交,处理器不会在数据库事务中运行。
|
||||
|
||||
会话秘密、执行秘密仅存摘要,普通任务查询与日志不输出原文。保存迟到证据不构成执行授权。粗粒度队列锁是当前正确性基线,需要后续执行计划、压力与公平性验证;没有声称支持某个生产吞吐数字。
|
||||
|
||||
## 剩余工作
|
||||
|
||||
- Worker SDK 的处理器注册与运行循环、保守租约截止、自动续租、重连、结果重报、优雅退出。
|
||||
- API/SDK 执行历史与证据查询,WS JSON Schema 和兼容性验证。
|
||||
- 运行中取消、客户端慢消费及更多网络故障、结果未知/不协作处理器的端到端用例。
|
||||
- P3 的策略化自动重试、速率和其他配额、调度及结果订阅。
|
||||
- P4–P7 的流程、运维、性能和最终交付验证。
|
||||
|
||||
当前已实现的是可以经 WSS 操作的服务端执行内核。尚未完成独立 Worker 接入交付,也未完成生产高可用和容量验收。
|
||||
Reference in New Issue
Block a user