Compare commits
1 Commits
codex/orbi
...
v0.1.1
| Author | SHA1 | Date | |
|---|---|---|---|
| 81e56bd633 |
@@ -1,5 +1,7 @@
|
|||||||
# Example only. Load environment variables explicitly; binaries do not read .env.
|
# Example only. Load environment variables explicitly; binaries do not read .env.
|
||||||
ORBIT_HTTP_ADDR=127.0.0.1:8080
|
ORBIT_HTTP_ADDR=127.0.0.1:8080
|
||||||
|
# 控制台默认队列,不替代登录及账号授权。
|
||||||
|
ORBIT_CONSOLE_QUEUE_ID=
|
||||||
# Set a real DSN through your secret manager. No credentials are committed.
|
# Set a real DSN through your secret manager. No credentials are committed.
|
||||||
ORBIT_MYSQL_DSN=
|
ORBIT_MYSQL_DSN=
|
||||||
ORBIT_DB_MAX_OPEN=20
|
ORBIT_DB_MAX_OPEN=20
|
||||||
|
|||||||
35
CHANGELOG.md
Normal file
35
CHANGELOG.md
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
# 版本记录
|
||||||
|
|
||||||
|
代码交付主分支为 `main`。采用 `v主版本.次版本.修订号`,已发布标签不可变;补丁按 `v0.1.1`、`v0.1.2` 递增,业务项目固定具体版本。
|
||||||
|
|
||||||
|
## v0.1.1 — 2026-09-24
|
||||||
|
|
||||||
|
本版汇总 v0.1.0 之后已完成的控制台、运维和业务接入能力,并统一示例和接入文档。
|
||||||
|
|
||||||
|
### 新增及完善
|
||||||
|
|
||||||
|
- 控制台账号密码登录、页面访问保护、初始化管理员与登录页;前端自动使用同源服务地址。
|
||||||
|
- Compose 迁移/权限收紧/核验/启动链、域名反向代理示例及两节点部署覆盖配置。
|
||||||
|
- 可配置的历史保留策略、归档文件作业、周期归档计划及控制台作业管理。
|
||||||
|
- 跨节点重连、慢消费者、锁等待/死锁、增长与归档的隔离回归,详细范围见各验收报告。
|
||||||
|
- 独立 MySQL 事务 Outbox 适配包:调用方事务入队、受理确认钩子、持久预算与有界后台发送。
|
||||||
|
- 现有 HTTP 服务嵌入示例:业务事务 → Outbox → Worker → 可靠结果 → Inbox,含健康检查和有界关闭。
|
||||||
|
- 根 `examples/` 集中 27 个可运行场景,各有 README;首页按功能、启动、SDK、配置和运维组织。
|
||||||
|
|
||||||
|
### 版本与升级
|
||||||
|
|
||||||
|
| 发布物 | Git 标签 | 引用方式 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| 平台源码 | `v0.1.1` | 检出该标签构建服务端 |
|
||||||
|
| Go SDK | `sdk/go/v0.1.1` | `go get git.yuntuo.hk/k2safe/orbit/sdk/go@v0.1.1` |
|
||||||
|
| MySQL Outbox | `adapters/outbox/mysql/v0.1.1` | `go get git.yuntuo.hk/k2safe/orbit/adapters/outbox/mysql@v0.1.1` |
|
||||||
|
|
||||||
|
SDK 公共方法与 v0.1.0 保持一致,示例从 `sdk/go/examples/<name>` 移至 `examples/<name>`;原先 `cd sdk/go && go run ./examples/worker` 改为 `cd examples && go run ./worker`。示例不是业务导入包,核心 SDK 导入路径不变。
|
||||||
|
|
||||||
|
服务端数据库基线为 schema v31。已有数据库按[运行手册](docs/20-operations-runbook.md)备份、停旧写节点、执行前向迁移及 `orbit-admin verify`,然后启动新服务;不覆盖旧迁移文件。Outbox 表属于独立业务数据库,由业务迁移管理。
|
||||||
|
|
||||||
|
[本版发布核验](docs/reports/v0.1.1-release.md)记录本地回归、远端版本和外部项目安装结果。保留策略及归档不会自动删除源数据;生产跨故障域高可用和容量仍按[交付清单](docs/release-checklist.md)验收。
|
||||||
|
|
||||||
|
## v0.1.0
|
||||||
|
|
||||||
|
首个 SDK 接入版本,平台和 SDK 已使用不可变标签发布。远端安装与最初门禁证据见[首版发布报告](docs/reports/phase-7-sdk-remote-release.md)。
|
||||||
4
Makefile
4
Makefile
@@ -4,6 +4,7 @@ GO ?= go
|
|||||||
fmt:
|
fmt:
|
||||||
$(GO) fmt ./...
|
$(GO) fmt ./...
|
||||||
cd sdk/go && $(GO) fmt ./...
|
cd sdk/go && $(GO) fmt ./...
|
||||||
|
cd examples && GOWORK=off $(GO) fmt ./...
|
||||||
cd examples/result-inbox && GOWORK=off $(GO) fmt ./...
|
cd examples/result-inbox && GOWORK=off $(GO) fmt ./...
|
||||||
cd examples/task-outbox && GOWORK=off $(GO) fmt ./...
|
cd examples/task-outbox && GOWORK=off $(GO) fmt ./...
|
||||||
cd adapters/outbox/mysql && GOWORK=off $(GO) fmt ./...
|
cd adapters/outbox/mysql && GOWORK=off $(GO) fmt ./...
|
||||||
@@ -12,6 +13,7 @@ fmt:
|
|||||||
test:
|
test:
|
||||||
$(GO) test -race ./...
|
$(GO) test -race ./...
|
||||||
cd sdk/go && $(GO) test -race ./...
|
cd sdk/go && $(GO) test -race ./...
|
||||||
|
cd examples && GOWORK=off $(GO) test -race ./...
|
||||||
cd examples/result-inbox && GOWORK=off $(GO) test -race ./...
|
cd examples/result-inbox && GOWORK=off $(GO) test -race ./...
|
||||||
cd examples/task-outbox && GOWORK=off $(GO) test -race ./...
|
cd examples/task-outbox && GOWORK=off $(GO) test -race ./...
|
||||||
cd adapters/outbox/mysql && GOWORK=off $(GO) test -race ./...
|
cd adapters/outbox/mysql && GOWORK=off $(GO) test -race ./...
|
||||||
@@ -20,12 +22,14 @@ test:
|
|||||||
vet:
|
vet:
|
||||||
$(GO) vet ./...
|
$(GO) vet ./...
|
||||||
cd sdk/go && $(GO) vet ./...
|
cd sdk/go && $(GO) vet ./...
|
||||||
|
cd examples && GOWORK=off $(GO) vet ./...
|
||||||
cd examples/result-inbox && GOWORK=off $(GO) vet ./...
|
cd examples/result-inbox && GOWORK=off $(GO) vet ./...
|
||||||
cd examples/task-outbox && GOWORK=off $(GO) vet ./...
|
cd examples/task-outbox && GOWORK=off $(GO) vet ./...
|
||||||
cd adapters/outbox/mysql && GOWORK=off $(GO) vet ./...
|
cd adapters/outbox/mysql && GOWORK=off $(GO) vet ./...
|
||||||
cd examples/http-service && GOWORK=off $(GO) vet ./...
|
cd examples/http-service && GOWORK=off $(GO) vet ./...
|
||||||
|
|
||||||
build:
|
build:
|
||||||
|
cd examples && GOWORK=off $(GO) build ./...
|
||||||
cd adapters/outbox/mysql && GOWORK=off $(GO) build ./...
|
cd adapters/outbox/mysql && GOWORK=off $(GO) build ./...
|
||||||
cd examples/http-service && GOWORK=off $(GO) build -o ../../bin/orbit-http-example ./cmd/server
|
cd examples/http-service && GOWORK=off $(GO) build -o ../../bin/orbit-http-example ./cmd/server
|
||||||
$(GO) build -o bin/orbit ./cmd/orbit
|
$(GO) build -o bin/orbit ./cmd/orbit
|
||||||
|
|||||||
309
README.md
309
README.md
@@ -1,122 +1,277 @@
|
|||||||
# Orbit · 星轨
|
# Orbit · 星轨
|
||||||
|
|
||||||
Orbit 是面向多个业务项目的通用任务调度与流程编排平台,采用 **Go + MySQL + HTTP/WebSocket**。
|
**Go + MySQL 构建的任务调度与流程编排平台。** 业务应用通过 HTTP 提交任务,Worker 通过 WebSocket 执行,结果通过可靠订阅交付;任务状态、计划、流程检查点与审计保存在 MySQL。
|
||||||
|
|
||||||
- **Pulse · 脉动**:异步任务、定时调度、执行授权与安全重试。
|
- **Pulse · 脉动**:异步任务、延迟执行、定时计划、执行授权、重试与结果订阅。
|
||||||
- **Weave · 织流**:研发定义发布流程,管理步骤、等待、有界查询与恢复。
|
- **Weave · 织流**:研发定义并发布流程,支持顺序、并行、条件分支、等待信号、有界查询和人工恢复。
|
||||||
- 业务处理器运行在接入方 Worker 中;平台不内置行业规则。
|
- **Console**:账号密码登录的管理页面,查看任务、计划、流程、结果交付及归档作业。
|
||||||
|
|
||||||
## 当前进度
|
主分支:`main`。当前版本:**`v0.1.1`**。源码、SDK 和 Outbox 适配包采用固定版本发布,已发布标签不覆盖。变更见 [CHANGELOG](CHANGELOG.md)。
|
||||||
|
|
||||||
已完成 P0–P5 平台功能阶段验收:36 个数据模型、版本化迁移、凭据及范围校验、队列与任务 API、WSS 执行、独立 SDK、自动 Worker 和 [执行尝试/证据查询](docs/api/execution-history.md)。[Worker Schema](docs/api/worker-schema.md) 与真实进程强杀恢复回归已通过;[安全重试](docs/api/retries.md)、[定时计划](docs/api/schedules.md)、[运行中取消](docs/api/cancellation.md) 、[队列资源控制](docs/api/queues.md) 、[应用共享配额](docs/api/application-resources.md) 、[资源键互斥](docs/api/keyed-concurrency.md) 和 [优先级/节点公平派发](docs/api/priority-and-fairness.md) 已接入服务端和 SDK,[可靠结果订阅](docs/api/subscriptions.md) 已实现持久化核心、HTTP/WSS、管理 SDK 与示例,[消费 SDK](docs/sdk/event-consumer.md) 和 [独立 MySQL Inbox 示例](docs/examples/result-inbox.md) 已实现;[批量任务受理](docs/api/batch-tasks.md) 已提供逐项幂等、失败分类与 SDK 示例;[人工核查与重试](docs/api/task-recovery.md) 已提供带证据的管理接口、关联新任务、审计查询及运行示例;[业务键与时间范围查询](docs/api/task-queries.md) 已提供过滤、分页与SDK场景;[任务来源查询](docs/api/task-source.md) 已提供人工重试父任务、计划触发记录与固定版本;[业务事务Outbox](docs/examples/task-outbox.md) 已提供独立业务库、稳定提交身份、发送恢复与CLI;[相对延迟执行](docs/examples/delayed-task.md)已提供数据库计时及原请求恢复;完整范围核对见[P3验收](docs/reports/phase-3.md),生产验证与首版交付按 [持续开发计划](docs/08-development-plan.md) 继续推进。
|
## 从这里开始
|
||||||
|
|
||||||
Weave已提供[定义发布](docs/api/workflow-definitions.md)、[实例启动、步骤详情、暂停/继续/取消、信号和操作审计](docs/api/workflows.md),以及[六类人工核查恢复](docs/api/workflow-recovery.md)的HTTP与独立Go SDK。持久运行器支持顺序、分支、有限并行、TIMER、SIGNAL及有界POLL,恢复沿用原预算与截止。[并行作业与回执示例](docs/examples/workflow.md)提供完整调用链;[历史激活/轮次/信号及信号审计](docs/api/workflow-history.md)已接入;[实例筛选分页](docs/api/workflow-queries.md)已接入,[状态事件时间线](docs/api/workflow-events.md)已接入,独立[轮询](docs/examples/workflow-poll.md)与[恢复](docs/examples/workflow-recovery.md)示例已接入,已补[版本/暂停竞争/全停回归](docs/reports/phase-4-5-races.md),功能阶段证据见[P4/P5核对](docs/reports/phase-4-5.md),提交断线及派发未送达见[故障边界](docs/reports/phase-6-fault-boundaries.md);[任务流程来源](docs/api/task-source.md#5-流程固定来源)已接入,P4/P5功能阶段已通过,P6生产验证和P7发布交付继续推进。
|
| 你要做什么 | 入口 |
|
||||||
|
| --- | --- |
|
||||||
|
| 第一次启动平台、设置管理员 | [快速开始](#快速开始) |
|
||||||
|
| 使用 Docker 启动,后续接入域名 | [Docker 与域名部署](#docker-与域名部署) |
|
||||||
|
| 了解全部能力和用法 | [功能一览](#功能一览) |
|
||||||
|
| 业务 Go 项目接入 | [SDK 怎么调用](#sdk-怎么调用) |
|
||||||
|
| 直接运行完整场景 | [examples:27 个可运行示例](examples/README.md) |
|
||||||
|
| 嵌入现有 HTTP 服务 | [HTTP + Outbox + Worker + Inbox](examples/http-service/README.md) |
|
||||||
|
| 查字段、错误码、权限及协议 | [HTTP / WebSocket API](docs/api/README.md)、[Go SDK 手册](docs/sdk/README.md) |
|
||||||
|
| 配置、排障、备份、发布 | [配置与运维](#配置与运维)、[运行手册](docs/20-operations-runbook.md) |
|
||||||
|
|
||||||
数据库禁止外键,关联一致性通过服务端事务校验,索引、唯一约束和 CHECK 保留;新装库使用无外键当前版本基线,已有库沿不可变迁移链升级;readiness 同时检查迁移及零外键要求。[运行观测](docs/api/observability.md)提供固定基数 HTTP、数据库池和后台批次指标;发布前可执行只读的 [`orbit-admin verify`](docs/api/operations.md) 核验迁移、零外键和固定索引。这不表示完整平台已具备生产服务能力。验证证据见 [P0](docs/reports/phase-0.md)、[P1](docs/reports/phase-1.md)、[P2 阶段验收](docs/reports/phase-2.md)、[安全重试](docs/reports/phase-3-safe-retry.md)、[计划调度](docs/reports/phase-3-schedules.md)、[取消与无外键回归](docs/reports/phase-3-cancellation.md) 及 [队列资源回归](docs/reports/phase-3-queue-resources.md)。
|
## 功能一览
|
||||||
|
|
||||||
## 目录
|
每个示例目录都有 README、源码、启动方式和结果核对。接口手册包含字段、权限、错误码和恢复约定。
|
||||||
|
|
||||||
```text
|
### Pulse:任务与调度
|
||||||
cmd/orbit/ 基础 HTTP 服务入口
|
|
||||||
cmd/orbit-migrate/ 独立数据库迁移命令
|
|
||||||
cmd/orbit-admin/ 受控初始化与私密凭据交付
|
|
||||||
model/ 公共 ID、JSON、摘要与记录原语
|
|
||||||
platform/model/ 应用、命名空间、幂等、事件和审计
|
|
||||||
platform/auth/ 凭据格式与动作/队列授权范围
|
|
||||||
pulse/model/ 任务、尝试、队列、计划和执行许可
|
|
||||||
pulse/service/ 任务与队列应用契约、输入校验
|
|
||||||
pulse/worker/ 会话、开始、续租、结果和恢复契约
|
|
||||||
pulse/retry/ 冻结策略、有限退避与未知效果决策
|
|
||||||
pulse/schedule/ Cron/间隔、漏跑、版本及计划接口
|
|
||||||
internal/timezone/ 随计划冻结的内置时区数据快照
|
|
||||||
weave/model/ 定义、实例、步骤、信号和查询轮次
|
|
||||||
weave/definition/ 有限结构/类型校验与定义发布契约
|
|
||||||
weave/engine/ 不可变规则的有限步骤决策与精确结果映射
|
|
||||||
weave/instance/ 实例受理、当前详情及操作审计契约
|
|
||||||
weave/signal/ 内部可靠信号受理/查询契约及显式激活身份
|
|
||||||
weave/control/ 内部版本化暂停/继续/取消契约
|
|
||||||
internal/config/ 配置校验
|
|
||||||
internal/storage/mysql/ 连接、事务、迁移及集成测试
|
|
||||||
internal/transport/httpserver/ HTTP 接入
|
|
||||||
sdk/go/ 独立 Go SDK module 与示例
|
|
||||||
adapters/outbox/mysql/ 可直接引用的业务事务 Outbox 独立模块
|
|
||||||
examples/http-service/ HTTP + Outbox + Worker + Inbox 完整服务示例
|
|
||||||
scripts/ 可复现的回归工具
|
|
||||||
docs/ 设计、接口、SDK、场景与验证报告
|
|
||||||
```
|
|
||||||
|
|
||||||
## 本地运行
|
| 功能 | 做什么 / 怎么用 | 可运行示例 / 接口 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| 即时任务与提交幂等 | `SubmitTask` 提交固定处理器版本与 JSON;重报复用原操作键,`GetTask` 查当前状态 | [tasks](examples/tasks/README.md) · [任务接口](docs/api/tasks.md) |
|
||||||
|
| 延迟任务 | `DelayMS` 从首次受理计时;`AvailableAt` 指定绝对时刻 | [delayed-task](examples/delayed-task/README.md) |
|
||||||
|
| 批量受理 | `SubmitTasks` 最多 32 项,逐项返回受理/拒绝/未知,按原身份补交 | [batch](examples/batch/README.md) · [批量接口](docs/api/batch-tasks.md) |
|
||||||
|
| 自动 Worker | 注册处理器与版本,`NewWorker(...).Run(ctx)` 负责连接、授权、续租、上报与排空 | [worker](examples/worker/README.md) · [运行器手册](docs/sdk/worker-runtime.md) |
|
||||||
|
| 安全重试 | 冻结次数、退避与总时限;明确可重试失败自动再执行,未知效果按安全策略核查 | [retry](examples/retry/README.md) · [重试策略](docs/api/retries.md) |
|
||||||
|
| 取消 | `CancelTask` 保存取消意图;运行中的处理器配合停止并结清 | [cancellation](examples/cancellation/README.md) |
|
||||||
|
| 定时计划 | Cron / 固定间隔、时区、不可变版本、漏跑策略、暂停/恢复和触发历史 | [schedules](examples/schedules/README.md) · [计划接口](docs/api/schedules.md) |
|
||||||
|
| 队列资源控制 | 创建/配置队列并发、开始速率、积压上限和暂停;满额返回背压 | [resources](examples/resources/README.md) · [队列接口](docs/api/queues.md) |
|
||||||
|
| 应用共享配额 | 同一应用的多个命名空间/队列共享总额度 | [application-resources](examples/application-resources/README.md) |
|
||||||
|
| 资源键互斥 | `ConcurrencyKey` 协调跨队列同资源任务,资源端核验递增许可序号 | [keyed-concurrency](examples/keyed-concurrency/README.md) |
|
||||||
|
| 优先级 | 任务优先级 0–9,结合等待时间排序与节点轮转派发 | [priority](examples/priority/README.md) |
|
||||||
|
| 查询与来源 | 按队列、状态、业务键、创建时间分页;追溯普通提交、计划、流程和人工重试来源 | [task-query](examples/task-query/README.md) · [来源接口](docs/api/task-source.md) |
|
||||||
|
| 历史与证据 | 查询每次尝试、原结果及迟到/冲突报告,保留原始记录 | [history](examples/history/README.md) |
|
||||||
|
| 人工核查与重试 | `ReviewTask` 提交证据;`RetryTask` 创建关联新任务并保留审计 | [recovery](examples/recovery/README.md) |
|
||||||
|
|
||||||
要求 Go 1.27.1、MySQL 8.4+。先准备专用数据库和凭据,通过环境变量注入;程序不会自动读取 `.env` 文件。
|
### Weave:流程编排
|
||||||
|
|
||||||
|
| 功能 | 做什么 / 怎么用 | 可运行示例 / 接口 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| 定义与版本 | 研发使用 SDK 创建定义、发布不可变版本;运行实例固定启动版本 | [workflow-definition](examples/workflow-definition/README.md) · [定义格式](docs/api/workflow-definition-format.md) |
|
||||||
|
| 顺序、条件、并行与汇合 | 用有限结构组合任务与结果映射;持久化每一步和推进检查点 | [workflow](examples/workflow/README.md) · [实例接口](docs/api/workflows.md) |
|
||||||
|
| 时间与外部信号等待 | TIMER 到期继续;SIGNAL 按固定等待身份接收外部回执 | [workflow](examples/workflow/README.md) · [信号设计](docs/14-workflow-signals.md) |
|
||||||
|
| 有界重复查询 | POLL 分别限制业务查询轮次和单轮请求重试,处理中继续等待,耗尽转核查 | [workflow-poll](examples/workflow-poll/README.md) |
|
||||||
|
| 暂停、继续、取消 | 停止推进后续工作,同时收集已发出的在途结果 | [控制接口](docs/api/workflows.md) · [控制语义](docs/15-workflow-controls.md) |
|
||||||
|
| 人工恢复 | 按原因、证据、版本核查任务/步骤/等待;恢复沿用原历史、预算和截止 | [workflow-recovery](examples/workflow-recovery/README.md) · [恢复接口](docs/api/workflow-recovery.md) |
|
||||||
|
| 实例查询与审计 | 筛选分页,查步骤详情、历史激活、查询轮次、信号及状态时间线 | [workflow-query](examples/workflow-query/README.md) · [历史接口](docs/api/workflow-history.md) · [时间线](docs/api/workflow-events.md) |
|
||||||
|
|
||||||
|
### 业务接入与管理
|
||||||
|
|
||||||
|
| 功能 | 做什么 / 怎么用 | 入口 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| 可靠结果订阅 | 先创建订阅,再由 EventConsumer 通过 WebSocket 接收结果;业务提交后 ACK,失败按预算重新交付 | [subscriptions](examples/subscriptions/README.md) · [消费 SDK](docs/sdk/event-consumer.md) |
|
||||||
|
| 事务 Outbox 公共包 | `EnqueueTx` 将待发请求写入业务事务,`Run` 后台发送;网络结果不明复用原身份 | [MySQL 适配包](docs/sdk/outbox-mysql.md) · [task-outbox](examples/task-outbox/README.md) |
|
||||||
|
| 业务结果 Inbox | 事件去重与业务更新同事务,提交成功后确认交付 | [result-inbox](examples/result-inbox/README.md) |
|
||||||
|
| HTTP 服务完整生命周期 | 业务接口、Outbox、Worker、结果消费、就绪检查和有界关闭放进同一业务服务 | [http-service](examples/http-service/README.md) |
|
||||||
|
| 平台身份与凭据 | 应用/命名空间/队列授权范围、凭据轮换/撤销;SDK 不直连平台数据库 | [鉴权](docs/api/authentication.md) · [凭据管理](docs/api/authentication.md) |
|
||||||
|
| 账号密码控制台 | 初始化管理员,登录查看统计、任务/计划/流程/交付详情和管理操作,未登录跳转登录页 | [Console 手册](docs/console.md) |
|
||||||
|
| 保留策略与周期归档 | 配置各类数据保留天数,持久化归档计划/作业,分页、续跑、重试与文件核验 | [保留策略](docs/api/retention.md) · [周期归档](docs/api/archive-scheduler.md) |
|
||||||
|
| 运维与观测 | 健康/readiness、独立指标端口、迁移核验、负载工具、备份恢复与故障演练 | [观测](docs/api/observability.md) · [运维](docs/20-operations-runbook.md) |
|
||||||
|
|
||||||
|
## 快速开始
|
||||||
|
|
||||||
|
需要 **Go 1.27.1、MySQL 8.4**,先创建专用数据库 `orbit`;下方管理员密码提示和读取队列 ID 的辅助命令使用 Python 3。程序通过环境变量配置,**不会自动读取 `.env`**。如当前 shell 设置了 `GOTOOLCHAIN=local`,必须安装满足版本要求的 Go。
|
||||||
|
|
||||||
|
### 1. 获取代码并迁移数据库
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
|
git clone --branch v0.1.1 https://git.yuntuo.hk/k2safe/orbit.git
|
||||||
|
cd orbit
|
||||||
export ORBIT_MYSQL_DSN='user:password@tcp(127.0.0.1:3306)/orbit'
|
export ORBIT_MYSQL_DSN='user:password@tcp(127.0.0.1:3306)/orbit'
|
||||||
export ORBIT_HTTP_ADDR='127.0.0.1:8080'
|
export ORBIT_HTTP_ADDR='127.0.0.1:8080'
|
||||||
go run ./cmd/orbit-migrate up
|
go run ./cmd/orbit-migrate up
|
||||||
|
```
|
||||||
|
|
||||||
|
DSN 替换为实际账号密码。`--branch v0.1.1` 检出固定发布版本;参与开发使用 `git switch main`。已有库先备份,再按[升级与发布手册](docs/20-operations-runbook.md)停旧写节点、迁移和核验;不修改已应用的迁移文件。
|
||||||
|
|
||||||
|
### 2. 一次性创建示例资源与管理员
|
||||||
|
|
||||||
|
下面在独立演示应用中授予所有流程及任务演示所需权限,并设置一个管理员。密码至少 12 字节,通过标准输入传递,不写入命令行或 Git。
|
||||||
|
|
||||||
|
```sh
|
||||||
|
umask 077
|
||||||
|
mkdir -p .local
|
||||||
|
python3 -c 'import getpass; print(getpass.getpass("设置管理员密码(至少12字节):"))' | \
|
||||||
|
go run ./cmd/orbit-admin bootstrap \
|
||||||
|
--application sample-app --namespace default --environment development \
|
||||||
|
--queue examples --worker-access --schedule-access --event-access \
|
||||||
|
--recovery-access --workflow-access --workflow-run-access \
|
||||||
|
--workflow-control-access --workflow-signal-access \
|
||||||
|
--workflow-recovery-access --workflow-audit-access \
|
||||||
|
--console-username admin --console-display-name 'Orbit 管理员' \
|
||||||
|
--console-password-stdin --output .local/development.credentials.json
|
||||||
|
```
|
||||||
|
|
||||||
|
初始化只运行一次,后续重启复用数据库、账号和 SDK 凭据。凭据 JSON 是服务端程序访问 API 的秘密文件,**控制台不需要选择或上传它**。已有资源增加管理员的方法见 [Console 手册](docs/console.md);真实接入按实际角色缩小权限。
|
||||||
|
|
||||||
|
### 3. 启动平台,进入控制台
|
||||||
|
|
||||||
|
```sh
|
||||||
|
export ORBIT_CONSOLE_QUEUE_ID="$(python3 -c 'import json; print(json.load(open(".local/development.credentials.json"))["queue_id"])')"
|
||||||
go run ./cmd/orbit
|
go run ./cmd/orbit
|
||||||
```
|
```
|
||||||
|
|
||||||
上方 DSN 为本地占位示例,需替换为实际凭据。部署时使用秘密管理和经过验证的 TLS 配置;迁移账户与运行账户分开授权。运行程序不自动迁移数据库。
|
打开 **<http://127.0.0.1:8080/console/>**,用 `admin` 和刚设置的密码登录。页面自动使用当前访问地址请求服务端,统计与列表从平台接口读取 MySQL 中的数据。
|
||||||
|
|
||||||
另一个终端执行 SDK 示例:
|
### 4. 跑一条完整执行链
|
||||||
|
|
||||||
|
另开终端,从仓库根目录执行:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cd sdk/go
|
export ORBIT_URL=http://127.0.0.1:8080
|
||||||
ORBIT_URL=http://127.0.0.1:8080 go run ./examples/health
|
export ORBIT_CREDENTIALS_FILE="$PWD/.local/development.credentials.json"
|
||||||
|
cd examples
|
||||||
|
go run ./health
|
||||||
|
go run ./worker
|
||||||
```
|
```
|
||||||
|
|
||||||
任务接入从 [初始化凭据](docs/api/authentication.md) 开始,再按 [SDK 接入](docs/sdk/README.md) 运行受理/取消示例。[自动 Worker 示例](docs/sdk/worker-runtime.md) 演示处理器注册、并发消费、结果确认与排空;特殊接入也可使用 [底层协议示例](docs/sdk/worker.md)。
|
健康检查显示 `liveness=alive readiness=ready`;Worker 示例实际创建并执行三条文本任务,最后输出:
|
||||||
|
|
||||||
## 开发与回归
|
```text
|
||||||
|
task=<任务ID> state=SUCCEEDED result={"text":"HELLO ORBIT"}
|
||||||
|
task=<任务ID> state=SUCCEEDED result={"text":"REUSABLE WORKER"}
|
||||||
|
task=<任务ID> state=SUCCEEDED result={"text":"DURABLE RESULT"}
|
||||||
|
worker_drained=true started=3 confirmed=3 running=0
|
||||||
|
```
|
||||||
|
|
||||||
|
刷新控制台可查看这些任务。继续在 `examples` 目录运行 `go run ./schedules`、`go run ./workflow` 或 `go run ./workflow-poll` 体验定时和流程;全部 27 个场景及特殊准备条件见 [examples/README.md](examples/README.md)。
|
||||||
|
|
||||||
|
## SDK 怎么调用
|
||||||
|
|
||||||
|
### 安装固定版本
|
||||||
|
|
||||||
|
在自己的业务项目中执行:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
make fmt
|
go get git.yuntuo.hk/k2safe/orbit/sdk/go@v0.1.1
|
||||||
make test
|
# 业务事务需要 MySQL Outbox 时再安装:
|
||||||
make vet
|
go get git.yuntuo.hk/k2safe/orbit/adapters/outbox/mysql@v0.1.1
|
||||||
make build
|
|
||||||
make image
|
|
||||||
make integration
|
|
||||||
make console-e2e
|
|
||||||
make protocol-check
|
|
||||||
make docs-check
|
|
||||||
```
|
```
|
||||||
|
|
||||||
首版发布前按[交付核对清单](docs/release-checklist.md)逐项留存命令输出和目标环境证据;当前阶段回归不替代生产拓扑、容量、复制切换或 RPO/RTO 验收。
|
无需本地源码或 `replace`。SDK 是独立 Go module,只依赖标准库和 WebSocket 客户端;MySQL 驱动属于可选适配包。子模块的 Git 标签分别为 `sdk/go/v0.1.1` 和 `adapters/outbox/mysql/v0.1.1`。
|
||||||
|
|
||||||
`make integration` 要求 Docker、OpenSSL 等标准命令,启动独立的临时 MySQL 容器,使用随机凭据和回环随机端口;完成后删除该测试容器。不会连接已有业务数据库。可通过 `GO`、`DOCKER` 和 `ORBIT_TEST_MYSQL_IMAGE` 指定工具/测试镜像。
|
### 提交、执行、接收结果
|
||||||
|
|
||||||
受理层负载采样工具见 [有界受理负载工具](docs/api/load.md),只允许在隔离命名空间或一次性数据库中运行;它不自动重试、不启动 Worker,也不提供生产容量承诺。
|
一次完整接入分为三个角色,可以分进程,也可以嵌入同一业务 HTTP 服务:
|
||||||
|
|
||||||
历史数据可通过控制台配置保留窗口,也可使用 [`orbit-admin retention archive`](docs/api/retention-jobs.md) 自动分批落盘、断点续跑和离线核验。当前保留源数据,周期归档调度和删除执行器另行交付。
|
```text
|
||||||
|
业务事务 → Outbox → HTTP 提交到 Orbit → WebSocket Worker 执行业务
|
||||||
|
↓
|
||||||
|
业务数据 ← Inbox ← WebSocket 结果订阅 ← 持久化结果
|
||||||
|
```
|
||||||
|
|
||||||
真实Worker与任务完成路径测量使用[`orbit-exec-load`](docs/api/execution-load.md):短/混合/中长模拟任务、持久结果和单次尝试核验、阶段延迟分布;不修改队列额度、不调用外部业务系统。定时积压复现可运行 `make schedule-backlog`,它只使用一次性 MySQL,并保留有界截止负例的实际分母。Weave 并行流程链路使用[`orbit-workflow-load`](docs/api/workflow-load.md),核对固定版本、步骤、来源和最终输出。定时集中触发使用[`orbit-schedule-load`](docs/api/schedule-load.md),逐项核对触发、任务、唯一尝试与来源,并保留超时分母和暂停收尾证据。
|
下面是业务函数中的提交片段;完整 imports、main、Worker 注册和收尾见 [worker/main.go](examples/worker/main.go)。`baseURL` 为实际平台地址,例如 `https://orbit.example.com`;`token` 和 `queueID` 从业务配置/Secret 注入。
|
||||||
|
|
||||||
SDK 独立发布门禁使用 `make sdk-check`,在 `GOWORK=off` 下检查完整依赖图,并运行 SDK 的竞态测试、vet 和全包构建;规则和接入边界见 [SDK 发布门禁](docs/sdk/release.md)。
|
```go
|
||||||
|
client, err := orbit.NewClient(baseURL, orbit.Options{Token: token})
|
||||||
|
if err != nil { return err }
|
||||||
|
|
||||||
修改已应用迁移时会触发校验和拒绝;新增结构使用新的前向迁移。初始结构尚未部署生产。
|
// operationKey 和完整 request 必须先保存在业务库;网络重报仍使用原值。
|
||||||
|
request := orbit.SubmitTaskRequest{
|
||||||
|
QueueID: queueID,
|
||||||
|
Handler: "object.prepare", HandlerVersion: "v1", PayloadVersion: "v1",
|
||||||
|
Payload: json.RawMessage(`{"object_ref":"objects/input"}`),
|
||||||
|
TaskTimeoutMS: 60000,
|
||||||
|
Retry: orbit.RetryPolicy{MaxAttempts: 1, AttemptTimeoutMS: 10000},
|
||||||
|
RecoverySafety: orbit.RecoveryReconcileOnly,
|
||||||
|
}
|
||||||
|
accepted, err := client.SubmitTask(ctx, operationKey, request)
|
||||||
|
if err != nil { return err }
|
||||||
|
current, err := client.GetTask(ctx, accepted.Task.ID)
|
||||||
|
if err != nil { return err }
|
||||||
|
fmt.Println(current.ID, current.State)
|
||||||
|
```
|
||||||
|
|
||||||
## 文档入口
|
导入路径为 `orbit "git.yuntuo.hk/k2safe/orbit/sdk/go"`。处理器的名称、处理器版本和载荷版本必须与 Worker 注册能力一致;没有匹配的在线 Worker 时,提交成功也不会立即执行。
|
||||||
|
|
||||||
- [持续开发与回归计划](docs/08-development-plan.md)
|
**任务受理不等于执行成功。** 同键重报返回原回执,最新状态用 `GetTask` 或结果事件核对。平台不能替外部系统保证“恰好执行一次”;副作用须使用业务幂等键、事务或证据核查。
|
||||||
- [数据模型与约束](docs/07-data-model.md)
|
|
||||||
- [HTTP / WebSocket 接口手册](docs/api/README.md)
|
|
||||||
- [Go SDK 接入](docs/sdk/README.md)
|
|
||||||
- [通用场景示例](docs/examples/README.md)
|
|
||||||
- [Orbit Console 控制台](docs/console.md)
|
|
||||||
- [运行与发布手册](docs/20-operations-runbook.md)
|
|
||||||
- [容器发布说明](docs/21-container-deployment.md)
|
|
||||||
- [设计文档总览](docs/README.md)
|
|
||||||
|
|
||||||
Git 远端:[k2safe/orbit](https://git.yuntuo.hk/k2safe/orbit),主分支 `main`。首个接入版本为 `v0.1.0`,业务项目使用 Go 1.27.1 或更高版本安装:
|
结果通知使用 `NewEventConsumer(...).Run(ctx)`。先创建持久订阅,再提交希望接收的任务;消费函数在 Inbox 与业务变更明确提交后返回 nil,SDK 才 ACK。断线重连、重复交付和业务去重见[消费手册](docs/sdk/event-consumer.md)。
|
||||||
|
|
||||||
|
### 现有 HTTP 服务如何接入
|
||||||
|
|
||||||
|
直接从 [examples/http-service](examples/http-service/README.md) 开始,完整命令、配置及 curl 请求见[运行手册](docs/examples/http-service.md)。该工程提供:
|
||||||
|
|
||||||
|
1. `init`:在独立业务库创建 Outbox、业务表、Inbox 和结果视图。
|
||||||
|
2. `provision`:创建可靠结果订阅,将订阅 ID 保存到部署配置。
|
||||||
|
3. `serve`:启动业务 HTTP、Outbox 发送器、Worker 和结果消费者。
|
||||||
|
4. 业务请求返回本地受理状态;随后查询到平台 TaskID、执行结果和业务视图。
|
||||||
|
5. 收到退出信号后,依次收尾 HTTP、发送器/Worker、结果消费者,最后关闭数据库。
|
||||||
|
|
||||||
|
只抽取发送器时使用[公共 Outbox 包](adapters/outbox/mysql/README.md):`EnqueueTx` 加入调用方事务,不提交事务、不发网络请求;`Run` 在后台提交并核对平台回执。业务确认钩子与 Outbox 确认同事务执行。
|
||||||
|
|
||||||
|
## Docker 与域名部署
|
||||||
|
|
||||||
|
仓库提供 [Dockerfile](Dockerfile)、[Compose 启动链](deploy/docker-compose.yml)和 [Nginx 配置](deploy/nginx/orbit.conf.example)。按[完整 Compose 手册](docs/22-compose-deployment.md)注入数据库密码、构建镜像、启动 MySQL/迁移/核验、初始化管理员,最后启动 Orbit。手册也包括停止、更新与两节点覆盖配置。
|
||||||
|
|
||||||
|
- Console 同源访问:域名反向代理到 Orbit 后,页面自动使用这个域名,无需在界面填写服务地址。
|
||||||
|
- 业务 SDK:把自己的 `baseURL` / 示例 `ORBIT_URL` 配置为该 HTTPS 域名,SDK 使用相应 WSS 地址。
|
||||||
|
- 网关保留 WebSocket Upgrade/Connection 头,健康检查使用 `/health/ready`。
|
||||||
|
- 停止容器保留 MySQL 和归档持久卷;更换镜像不等于删除数据。
|
||||||
|
|
||||||
|
## 配置与运维
|
||||||
|
|
||||||
|
配置完整示例见 [.env.example](.env.example)。由 shell、部署平台或 Secret 管理器显式注入:
|
||||||
|
|
||||||
|
| 配置 | 用途 |
|
||||||
|
| --- | --- |
|
||||||
|
| `ORBIT_MYSQL_DSN` | 平台数据库连接,迁移账号与运行账号按部署手册分开 |
|
||||||
|
| `ORBIT_HTTP_ADDR` | 服务进程监听地址,例 `127.0.0.1:8080` |
|
||||||
|
| `ORBIT_CONSOLE_QUEUE_ID` | 控制台默认队列;不授予账号额外权限 |
|
||||||
|
| `ORBIT_DB_MAX_OPEN` / `ORBIT_DB_MAX_IDLE` | 数据库连接池上限 |
|
||||||
|
| `ORBIT_SHUTDOWN_TIMEOUT` | SIGTERM 关闭窗口,默认 10s |
|
||||||
|
| `ORBIT_WORKFLOW_TICK_INTERVAL` / `ORBIT_SCHEDULE_TICK_INTERVAL` | 流程/计划后台扫描间隔,默认 1s |
|
||||||
|
| `ORBIT_RECOVERY_TICK_INTERVAL` / `ORBIT_RUNTIME_BATCH_LIMIT` | 恢复扫描间隔与每批上限,默认 2s / 100 |
|
||||||
|
| `ORBIT_WORKER_CONNECTION_LIMIT` / `ORBIT_EVENT_CONNECTION_LIMIT` | 每节点 WS 连接上限,默认各 128 |
|
||||||
|
| `ORBIT_DISPATCH_WORKERS` / `ORBIT_DISPATCH_CAPACITY` | 派发并发和有界内存队列,默认 4 / 128 |
|
||||||
|
| `ORBIT_METRICS_ADDR` | 独立内部指标监听,默认关闭 |
|
||||||
|
| `ORBIT_RETENTION_*_DAYS` | 首次初始化保留窗口;控制台保存后以数据库策略为准 |
|
||||||
|
| `ORBIT_ARCHIVE_ROOT` / `ORBIT_ARCHIVE_STORAGE_ID` | 周期归档卷路径与固定卷身份,二者一起配置 |
|
||||||
|
| `ORBIT_ARCHIVE_MAX_BYTES` / `ORBIT_ARCHIVE_TICK_INTERVAL` | 归档卷预算和调度间隔,默认 10 GiB / 10s |
|
||||||
|
|
||||||
|
默认保留窗口:任务、流程、事件各 **365 天**,交付、Inbox、幂等记录各 **90 天**,审计 **2555 天**。控制台可修改策略并配置周期归档;未结清任务、未知效果、未确认交付等受保护记录不会按时间简单处理。**当前归档导出并保留源数据,尚未提供源数据自动删除执行器。** 详细规则见[保留策略](docs/api/retention.md)和[归档作业](docs/api/archive-scheduler.md)。
|
||||||
|
|
||||||
|
常用检查:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
go get git.yuntuo.hk/k2safe/orbit/sdk/go@v0.1.0
|
curl --fail http://127.0.0.1:8080/health/ready
|
||||||
|
go run ./cmd/orbit-admin verify
|
||||||
|
go run ./cmd/orbit-admin observe snapshot
|
||||||
```
|
```
|
||||||
|
|
||||||
无需本地 `replace`;导入方式、完整调用与版本边界见 [SDK 接入](docs/sdk/README.md#5-外部项目通过远端接入)。
|
数据库禁止外键和级联删除;关联一致性由事务校验,保留唯一约束、索引和 CHECK。持久化模型及 SQL 字段都有中文注释。已有迁移不可回改,演进采用前向迁移。
|
||||||
|
|
||||||
[流程实例筛选分页](docs/api/workflow-queries.md)已提供独立SDK和[完整示例](docs/examples/workflow-query.md),按固定版本全部队列鉴权,数据库保持零外键。
|
## 项目目录
|
||||||
|
|
||||||
- [周期归档与作业管理](docs/api/archive-scheduler.md)
|
```text
|
||||||
|
cmd/ 平台、数据库迁移和管理命令
|
||||||
|
platform/ 应用、身份、授权、幂等、事件、审计
|
||||||
|
pulse/ 任务、Worker、重试、队列、定时计划
|
||||||
|
weave/ 流程定义、实例、步骤、等待和恢复
|
||||||
|
model/ 公共持久化类型与校验
|
||||||
|
internal/ MySQL 存储、HTTP/WS、配置与观测
|
||||||
|
sdk/go/ 可独立引用的 Go SDK
|
||||||
|
adapters/outbox/mysql/ 可独立引用的 MySQL Outbox 包
|
||||||
|
examples/ 27 个可运行场景及各自 README
|
||||||
|
deploy/ Compose、Nginx 和部署配置
|
||||||
|
scripts/ 构建、回归、故障和发布核验
|
||||||
|
docs/ API、SDK、场景、设计及验收报告
|
||||||
|
```
|
||||||
|
|
||||||
业务接入可直接使用[MySQL 事务 Outbox 适配包](docs/sdk/outbox-mysql.md)和[完整 HTTP 生命周期示例](docs/examples/http-service.md),覆盖已有事务、后台发送、结果入库以及有界关闭。
|
## 测试、版本与边界
|
||||||
|
|
||||||
|
在仓库根目录执行:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
make test vet build # 7 个模块的竞态测试、静态检查与构建
|
||||||
|
make sdk-check protocol-check docs-check
|
||||||
|
make integration # 临时 MySQL、真实平台、示例及故障回归
|
||||||
|
make console-e2e # 控制台端到端回归
|
||||||
|
```
|
||||||
|
|
||||||
|
集成测试需要 Docker、Python 3 和 OpenSSL 等工具,由脚本创建独立临时数据库并清理自建容器。生产容量与故障域验收另见[交付清单](docs/release-checklist.md);有限样本不能代表百万企业规模的生产容量。
|
||||||
|
|
||||||
|
`v0.1.1` 包含账号密码控制台、归档策略/周期作业、Outbox 公共包、HTTP 生命周期示例及统一示例目录;与上一版本的升级说明和验证结果见 [CHANGELOG](CHANGELOG.md) 与 [发布记录](docs/reports/v0.1.1-release.md)。当前未提供源数据删除、其他数据库 Outbox 适配,也不把单机或隔离环境多节点测试等同于生产跨故障域高可用验收。
|
||||||
|
|
||||||
|
更多资料:[设计文档](docs/README.md) · [持续开发计划](docs/08-development-plan.md) · [接口目录](docs/api/README.md) · [示例目录](examples/README.md) · [发布规则](docs/sdk/release.md)。
|
||||||
|
|||||||
@@ -8,3 +8,15 @@
|
|||||||
- [测试报告](../../../docs/reports/outbox-http-integration.md)
|
- [测试报告](../../../docs/reports/outbox-http-integration.md)
|
||||||
|
|
||||||
以业务自己的数据库存储待发命令,调用 `EnqueueTx` 加入已有事务,后台运行 `Run` 或 `SendOnce`。本包确认的是平台受理,任务执行完成通过 Worker 和可靠结果订阅衔接。
|
以业务自己的数据库存储待发命令,调用 `EnqueueTx` 加入已有事务,后台运行 `Run` 或 `SendOnce`。本包确认的是平台受理,任务执行完成通过 Worker 和可靠结果订阅衔接。
|
||||||
|
|
||||||
|
## 安装
|
||||||
|
|
||||||
|
```sh
|
||||||
|
go get git.yuntuo.hk/k2safe/orbit/adapters/outbox/mysql@v0.1.1
|
||||||
|
```
|
||||||
|
|
||||||
|
```go
|
||||||
|
import outbox "git.yuntuo.hk/k2safe/orbit/adapters/outbox/mysql"
|
||||||
|
```
|
||||||
|
|
||||||
|
Git 标签为 `adapters/outbox/mysql/v0.1.1`,无需本地 replace。先将 `SchemaSQL()` 纳入自己的业务迁移,再构造 `Store`;完整事务和运行器代码见上方接口手册。
|
||||||
|
|||||||
@@ -259,3 +259,10 @@ A04派发已提交而消息尚未到达Worker的精确进程故障已通过[专
|
|||||||
- 已交付完整 HTTP 宿主:业务接口、发送器、Worker、持久 Inbox、健康检查、后台错误传播、有界关闭和数据库最后释放。
|
- 已交付完整 HTTP 宿主:业务接口、发送器、Worker、持久 Inbox、健康检查、后台错误传播、有界关闭和数据库最后释放。
|
||||||
- 已通过:标准竞态测试、vet/build、SDK隔离和文档链接;定向真实MySQL/平台回归与平台全量 integration 均退出0。包括事务回滚/重复/旧快照、确认回滚、提交回执丢失、强杀恢复和SIGTERM收尾。
|
- 已通过:标准竞态测试、vet/build、SDK隔离和文档链接;定向真实MySQL/平台回归与平台全量 integration 均退出0。包括事务回滚/重复/旧快照、确认回滚、提交回执丢失、强杀恢复和SIGTERM收尾。
|
||||||
- [公共包接口](sdk/outbox-mysql.md)、[完整调用和故障示例](examples/http-service.md)、[验收报告](reports/outbox-http-integration.md)。本批不扩展到其他数据库/ORM、流程命令Outbox或源数据删除。
|
- [公共包接口](sdk/outbox-mysql.md)、[完整调用和故障示例](examples/http-service.md)、[验收报告](reports/outbox-http-integration.md)。本批不扩展到其他数据库/ORM、流程命令Outbox或源数据删除。
|
||||||
|
|
||||||
|
### main、正式版本与统一示例(本批)
|
||||||
|
|
||||||
|
- 根 examples 统一 27 个可运行场景,各目录 README 说明用途、权限、运行和结果;首页改为完整功能与接入入口。
|
||||||
|
- 开发工作区、构建、MySQL/控制台/历史 SDK 回归同步迁移路径;SDK 保持独立模块。
|
||||||
|
- 使用 main 与 v0.1.1 / sdk/go/v0.1.1 / adapters/outbox/mysql/v0.1.1 交付,旧标签不变;业务固定版本,无需开发分支或提交号。
|
||||||
|
- 标准 7 模块回归、SDK/协议/文档门禁、真实 MySQL 全量、控制台端到端及历史任务 API 双向 smoke 均通过;远端安装结果见[发布记录](reports/v0.1.1-release.md)。
|
||||||
|
|||||||
@@ -21,10 +21,10 @@ docker image inspect registry.example/orbit:dev --format '{{.Id}}'
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
docker build --platform linux/amd64 \
|
docker build --platform linux/amd64 \
|
||||||
--build-arg VERSION=1.0.0 \
|
--build-arg VERSION=v0.1.1 \
|
||||||
--build-arg REVISION="$(git rev-parse HEAD)" \
|
--build-arg REVISION="$(git rev-parse HEAD)" \
|
||||||
--build-arg BUILD_TIME="$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
|
--build-arg BUILD_TIME="$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
|
||||||
-t registry.example/orbit:1.0.0 .
|
-t registry.example/orbit:v0.1.1 .
|
||||||
```
|
```
|
||||||
|
|
||||||
镜像同时写入 OCI `org.opencontainers.image.version`、`org.opencontainers.image.revision` 和 `org.opencontainers.image.created` 标签;可以先核对标签,再在节点启动后通过 `GET /version` 核对进程实际使用的值。`registry.example` 只是占位符,不是平台依赖。
|
镜像同时写入 OCI `org.opencontainers.image.version`、`org.opencontainers.image.revision` 和 `org.opencontainers.image.created` 标签;可以先核对标签,再在节点启动后通过 `GET /version` 核对进程实际使用的值。`registry.example` 只是占位符,不是平台依赖。
|
||||||
@@ -33,7 +33,7 @@ docker build --platform linux/amd64 \
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
docker run --rm --entrypoint /usr/local/bin/orbit-admin \
|
docker run --rm --entrypoint /usr/local/bin/orbit-admin \
|
||||||
registry.example/orbit:1.0.0 release manifest > orbit-release-manifest.json
|
registry.example/orbit:v0.1.1 release manifest > orbit-release-manifest.json
|
||||||
```
|
```
|
||||||
|
|
||||||
清单把当前构建身份、协议版本和内置迁移校验和固定下来;部署前再用 `orbit-admin verify` 对目标数据库逐项核对。两者不一致时停止发布,不通过人工修改清单来“对齐”。
|
清单把当前构建身份、协议版本和内置迁移校验和固定下来;部署前再用 `orbit-admin verify` 对目标数据库逐项核对。两者不一致时停止发布,不通过人工修改清单来“对齐”。
|
||||||
@@ -60,7 +60,7 @@ docker run --rm \
|
|||||||
--env ORBIT_MYSQL_DSN \
|
--env ORBIT_MYSQL_DSN \
|
||||||
--entrypoint /usr/local/bin/orbit-admin \
|
--entrypoint /usr/local/bin/orbit-admin \
|
||||||
-v "$PWD/orbit-release-manifest.json:/run/orbit-release-manifest.json:ro" \
|
-v "$PWD/orbit-release-manifest.json:/run/orbit-release-manifest.json:ro" \
|
||||||
registry.example/orbit:1.0.0 verify --manifest /run/orbit-release-manifest.json
|
registry.example/orbit:v0.1.1 verify --manifest /run/orbit-release-manifest.json
|
||||||
|
|
||||||
docker run --rm \
|
docker run --rm \
|
||||||
--env ORBIT_MYSQL_DSN \
|
--env ORBIT_MYSQL_DSN \
|
||||||
|
|||||||
@@ -24,16 +24,16 @@ Compose 文件要求显式提供数据库密码,仓库没有默认密码,也
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
docker build \
|
docker build \
|
||||||
--build-arg VERSION=1.0.0 \
|
--build-arg VERSION=v0.1.1 \
|
||||||
--build-arg REVISION="$(git rev-parse HEAD)" \
|
--build-arg REVISION="$(git rev-parse HEAD)" \
|
||||||
--build-arg BUILD_TIME="$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
|
--build-arg BUILD_TIME="$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
|
||||||
-t orbit:1.0.0 .
|
-t orbit:v0.1.1 .
|
||||||
```
|
```
|
||||||
|
|
||||||
在当前 shell 或 Secret 管理器中注入配置。以下值仅是变量示例,不是生产密码:
|
在当前 shell 或 Secret 管理器中注入配置。以下值仅是变量示例,不是生产密码:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
export ORBIT_IMAGE=orbit:1.0.0
|
export ORBIT_IMAGE=orbit:v0.1.1
|
||||||
export ORBIT_DB_NAME=orbit
|
export ORBIT_DB_NAME=orbit
|
||||||
export ORBIT_DB_USER=orbit_runtime
|
export ORBIT_DB_USER=orbit_runtime
|
||||||
export ORBIT_DB_PASSWORD='从秘密管理器读取'
|
export ORBIT_DB_PASSWORD='从秘密管理器读取'
|
||||||
|
|||||||
@@ -121,7 +121,7 @@ curl -X POST "$ORBIT_URL/v1/application/resources:configure" \
|
|||||||
|
|
||||||
## 6. SDK 与可运行场景
|
## 6. SDK 与可运行场景
|
||||||
|
|
||||||
SDK 方法:`GetApplicationResources(ctx)` 和 `ConfigureApplicationResources(ctx, key, request)`。完整双命名空间场景源码:[application-resources](../../sdk/go/examples/application-resources/main.go)。
|
SDK 方法:`GetApplicationResources(ctx)` 和 `ConfigureApplicationResources(ctx, key, request)`。完整双命名空间场景源码:[application-resources](../../examples/application-resources/main.go)。
|
||||||
|
|
||||||
在仓库根目录,先用已迁移数据库启动服务,并初始化一个独立、空闲的示例应用:
|
在仓库根目录,先用已迁移数据库启动服务,并初始化一个独立、空闲的示例应用:
|
||||||
|
|
||||||
@@ -135,11 +135,11 @@ ORBIT_EXAMPLE_APP_ID=$(sed -n 's/.*"application_id":"\([^"]*\)".*/\1/p' .local/a
|
|||||||
go run ./cmd/orbit-admin bootstrap \
|
go run ./cmd/orbit-admin bootstrap \
|
||||||
--application-id "$ORBIT_EXAMPLE_APP_ID" --namespace second --environment development \
|
--application-id "$ORBIT_EXAMPLE_APP_ID" --namespace second --environment development \
|
||||||
--queue second --resource-access --output .local/app-second.credentials.json
|
--queue second --resource-access --output .local/app-second.credentials.json
|
||||||
cd sdk/go
|
cd examples
|
||||||
ORBIT_URL=http://127.0.0.1:8080 \
|
ORBIT_URL=http://127.0.0.1:8080 \
|
||||||
ORBIT_CREDENTIALS_FILE=../../.local/app-first.credentials.json \
|
ORBIT_CREDENTIALS_FILE=../.local/app-first.credentials.json \
|
||||||
ORBIT_SECOND_CREDENTIALS_FILE=../../.local/app-second.credentials.json \
|
ORBIT_SECOND_CREDENTIALS_FILE=../.local/app-second.credentials.json \
|
||||||
go run ./examples/application-resources
|
go run ./application-resources
|
||||||
```
|
```
|
||||||
|
|
||||||
预期:
|
预期:
|
||||||
|
|||||||
@@ -157,4 +157,4 @@ for _, item := range result.Items {
|
|||||||
|
|
||||||
SDK验证输入数量/身份/整体体积及返回数量、顺序、状态和回执归属;不自动重试、拆批或创建新键。`err == nil` 只表示取得可解释的逐项响应。局部错误为 `BatchItemError`,不是顶层APIError;整批HTTP错误仍为APIError,网络错误沿用标准库。独立SDK无数据库依赖。
|
SDK验证输入数量/身份/整体体积及返回数量、顺序、状态和回执归属;不自动重试、拆批或创建新键。`err == nil` 只表示取得可解释的逐项响应。局部错误为 `BatchItemError`,不是顶层APIError;整批HTTP错误仍为APIError,网络错误沿用标准库。独立SDK无数据库依赖。
|
||||||
|
|
||||||
完整运行命令、输入输出和收尾见 [批量场景](../examples/batch.md),源码见 [SDK示例](../../sdk/go/examples/batch/main.go),覆盖范围和实际证据见 [回归报告](../reports/phase-3-batch-tasks.md)。旧客户端继续使用单项接口;新SDK调用旧服务该路由会返回404,不会静默退化为其他语义。
|
完整运行命令、输入输出和收尾见 [批量场景](../examples/batch.md),源码见 [SDK示例](../../examples/batch/main.go),覆盖范围和实际证据见 [回归报告](../reports/phase-3-batch-tasks.md)。旧客户端继续使用单项接口;新SDK调用旧服务该路由会返回404,不会静默退化为其他语义。
|
||||||
|
|||||||
@@ -88,13 +88,13 @@ return nil, &orbit.WorkerCancellationConfirmed{
|
|||||||
|
|
||||||
## 4. 可运行场景
|
## 4. 可运行场景
|
||||||
|
|
||||||
源码:[cancellation/main.go](../../sdk/go/examples/cancellation/main.go)。使用 [Worker 初始化](../sdk/worker-runtime.md) 的私有凭据文件,需 tasks:submit/read/cancel、workers:connect/consume 和队列范围。此示例只等待停止提示,没有外部业务副作用。
|
源码:[cancellation/main.go](../../examples/cancellation/main.go)。使用 [Worker 初始化](../sdk/worker-runtime.md) 的私有凭据文件,需 tasks:submit/read/cancel、workers:connect/consume 和队列范围。此示例只等待停止提示,没有外部业务副作用。
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cd sdk/go
|
cd examples
|
||||||
ORBIT_URL=http://127.0.0.1:8080 \
|
ORBIT_URL=http://127.0.0.1:8080 \
|
||||||
ORBIT_CREDENTIALS_FILE=/private/path/worker.credentials.json \
|
ORBIT_CREDENTIALS_FILE=/private/path/worker.credentials.json \
|
||||||
go run ./examples/cancellation
|
go run ./cancellation
|
||||||
```
|
```
|
||||||
|
|
||||||
预期输出:
|
预期输出:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# 执行尝试与证据查询 v1
|
# 执行尝试与证据查询 v1
|
||||||
|
|
||||||
更新:2026-09-17。四个只读接口及独立 Go SDK 已实现;对应 [可运行示例](../../sdk/go/examples/history/main.go) 和 [回归记录](../reports/phase-2-execution-history.md)。
|
更新:2026-09-17。四个只读接口及独立 Go SDK 已实现;对应 [可运行示例](../../examples/history/main.go) 和 [回归记录](../reports/phase-2-execution-history.md)。
|
||||||
|
|
||||||
## 1. 用途与权限
|
## 1. 用途与权限
|
||||||
|
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ accepted, err := api.SubmitTask(ctx, "update-object-42-operation-001", orbit.Sub
|
|||||||
|
|
||||||
## 5. 完整可运行场景
|
## 5. 完整可运行场景
|
||||||
|
|
||||||
源码:[keyed-concurrency/main.go](../../sdk/go/examples/keyed-concurrency/main.go)。示例创建两个专用队列,每条队列提交一个相同资源键的任务;两个自动 Worker 各自容量为 4。处理器调用一个受控内存资源模型,查询尝试确认序号增长,最后模拟旧请求验证它被拒绝。
|
源码:[keyed-concurrency/main.go](../../examples/keyed-concurrency/main.go)。示例创建两个专用队列,每条队列提交一个相同资源键的任务;两个自动 Worker 各自容量为 4。处理器调用一个受控内存资源模型,查询尝试确认序号增长,最后模拟旧请求验证它被拒绝。
|
||||||
|
|
||||||
从仓库根目录,在专用开发数据库完成迁移并启动服务:
|
从仓库根目录,在专用开发数据库完成迁移并启动服务:
|
||||||
|
|
||||||
@@ -94,9 +94,9 @@ go run ./cmd/orbit
|
|||||||
上述命令使用预先设置的 `ORBIT_MYSQL_DSN`,服务使用 `ORBIT_HTTP_ADDR=127.0.0.1:8080`。示例凭据需具有全部队列范围的 queues:manage、tasks:submit/read 和 workers:connect/consume。另一个终端执行:
|
上述命令使用预先设置的 `ORBIT_MYSQL_DSN`,服务使用 `ORBIT_HTTP_ADDR=127.0.0.1:8080`。示例凭据需具有全部队列范围的 queues:manage、tasks:submit/read 和 workers:connect/consume。另一个终端执行:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cd sdk/go
|
cd examples
|
||||||
ORBIT_URL=http://127.0.0.1:8080 \
|
ORBIT_URL=http://127.0.0.1:8080 \
|
||||||
ORBIT_CREDENTIALS_FILE=/tmp/orbit-keyed.credentials.json go run ./examples/keyed-concurrency
|
ORBIT_CREDENTIALS_FILE=/tmp/orbit-keyed.credentials.json go run ./keyed-concurrency
|
||||||
```
|
```
|
||||||
|
|
||||||
正常输出:
|
正常输出:
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
`orbit-admin release manifest` 不连接数据库,输出当前二进制内置的构建身份、协议版本和完整迁移名称/校验和。它用于在构建阶段冻结发布证据;输出不含 DSN、凭据、迁移 SQL 或业务数据。
|
`orbit-admin release manifest` 不连接数据库,输出当前二进制内置的构建身份、协议版本和完整迁移名称/校验和。它用于在构建阶段冻结发布证据;输出不含 DSN、凭据、迁移 SQL 或业务数据。
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
docker run --rm --entrypoint /usr/local/bin/orbit-admin registry.example/orbit:1.0.0 release manifest > orbit-release-manifest.json
|
docker run --rm --entrypoint /usr/local/bin/orbit-admin registry.example/orbit:v0.1.1 release manifest > orbit-release-manifest.json
|
||||||
# 本地工作区也可执行:
|
# 本地工作区也可执行:
|
||||||
make release-manifest > orbit-release-manifest.json
|
make release-manifest > orbit-release-manifest.json
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ Worker 连接不再各自直接并发发起一批数据库领取。节点采用
|
|||||||
|
|
||||||
## 4. SDK 完整场景
|
## 4. SDK 完整场景
|
||||||
|
|
||||||
源码:[priority/main.go](../../sdk/go/examples/priority/main.go)。创建专用队列,先按 0、9、4 的顺序提交三条任务,再启动容量为 1 的自动 Worker;三条任务在近同时到期的条件下按 9、4、0 执行,每条只有一次尝试。
|
源码:[priority/main.go](../../examples/priority/main.go)。创建专用队列,先按 0、9、4 的顺序提交三条任务,再启动容量为 1 的自动 Worker;三条任务在近同时到期的条件下按 9、4、0 执行,每条只有一次尝试。
|
||||||
|
|
||||||
从仓库根目录准备专用开发数据库,设置 ORBIT_MYSQL_DSN 和 `ORBIT_HTTP_ADDR=127.0.0.1:8080` 后:
|
从仓库根目录准备专用开发数据库,设置 ORBIT_MYSQL_DSN 和 `ORBIT_HTTP_ADDR=127.0.0.1:8080` 后:
|
||||||
|
|
||||||
@@ -83,9 +83,9 @@ go run ./cmd/orbit
|
|||||||
凭据需要全部队列范围的 queues:manage、tasks:submit/read、workers:connect/consume。另一个终端执行:
|
凭据需要全部队列范围的 queues:manage、tasks:submit/read、workers:connect/consume。另一个终端执行:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cd sdk/go
|
cd examples
|
||||||
ORBIT_URL=http://127.0.0.1:8080 \
|
ORBIT_URL=http://127.0.0.1:8080 \
|
||||||
ORBIT_CREDENTIALS_FILE=/tmp/orbit-priority.credentials.json go run ./examples/priority
|
ORBIT_CREDENTIALS_FILE=/tmp/orbit-priority.credentials.json go run ./priority
|
||||||
```
|
```
|
||||||
|
|
||||||
预期输出:
|
预期输出:
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ SDK 返回 `*orbit.APIError`,Code=QUEUE_FULL、StatusCode=429、RetryAfter=tim
|
|||||||
|
|
||||||
## 完整 SDK 场景
|
## 完整 SDK 场景
|
||||||
|
|
||||||
源码:[resources/main.go](../../sdk/go/examples/resources/main.go)。先完成当前迁移并启动服务,初始化带 Worker 权限且 queues:manage 范围为全部队列的专用开发凭据:
|
源码:[resources/main.go](../../examples/resources/main.go)。先完成当前迁移并启动服务,初始化带 Worker 权限且 queues:manage 范围为全部队列的专用开发凭据:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
mkdir -p .local
|
mkdir -p .local
|
||||||
@@ -120,10 +120,10 @@ chmod 700 .local
|
|||||||
go run ./cmd/orbit-admin bootstrap \
|
go run ./cmd/orbit-admin bootstrap \
|
||||||
--application resources-demo --namespace default --environment development \
|
--application resources-demo --namespace default --environment development \
|
||||||
--queue bootstrap --worker-access --output .local/resources.credentials.json
|
--queue bootstrap --worker-access --output .local/resources.credentials.json
|
||||||
cd sdk/go
|
cd examples
|
||||||
ORBIT_URL=http://127.0.0.1:8080 \
|
ORBIT_URL=http://127.0.0.1:8080 \
|
||||||
ORBIT_CREDENTIALS_FILE=../../.local/resources.credentials.json \
|
ORBIT_CREDENTIALS_FILE=../.local/resources.credentials.json \
|
||||||
go run ./examples/resources
|
go run ./resources
|
||||||
```
|
```
|
||||||
|
|
||||||
示例创建独立队列(积压 2、并发 2、每秒 1 次开始),暂停后提交两个任务;第三个被拒,重复第一个仍得到原回执;取消第一个释放空间,用第三个原身份重新提交,然后恢复并执行两个纯数据回显任务。
|
示例创建独立队列(积压 2、并发 2、每秒 1 次开始),暂停后提交两个任务;第三个被拒,重复第一个仍得到原回执;取消第一个释放空间,用第三个原身份重新提交,然后恢复并执行两个纯数据回显任务。
|
||||||
|
|||||||
@@ -92,13 +92,13 @@ WorkerFailure 默认 Retryable=false;普通 error、panic、runtime.Goexit 和
|
|||||||
|
|
||||||
## 5. 运行完整示例
|
## 5. 运行完整示例
|
||||||
|
|
||||||
源码:[examples/retry/main.go](../../sdk/go/examples/retry/main.go)。先运行当前迁移、服务,并按 [Worker 初始化步骤](../sdk/worker.md#1-可运行的文本规范化示例) 准备具有提交、读取、消费权限的专用凭据。从仓库根目录执行:
|
源码:[examples/retry/main.go](../../examples/retry/main.go)。先运行当前迁移、服务,并按 [Worker 初始化步骤](../sdk/worker.md#1-可运行的文本规范化示例) 准备具有提交、读取、消费权限的专用凭据。从仓库根目录执行:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cd sdk/go
|
cd examples
|
||||||
ORBIT_URL=http://127.0.0.1:8080 \
|
ORBIT_URL=http://127.0.0.1:8080 \
|
||||||
ORBIT_CREDENTIALS_FILE=../../.local/worker.credentials.json \
|
ORBIT_CREDENTIALS_FILE=../.local/worker.credentials.json \
|
||||||
go run ./examples/retry
|
go run ./retry
|
||||||
```
|
```
|
||||||
|
|
||||||
输入为 `{"text":" safe retry "}`。第一次处理在产生效果前模拟明确拒绝,第二次执行真正的文本规范化;重试等待由平台持久化安排。
|
输入为 `{"text":" safe retry "}`。第一次处理在产生效果前模拟明确拒绝,第二次执行真正的文本规范化;重试等待由平台持久化安排。
|
||||||
|
|||||||
@@ -178,13 +178,13 @@ go run ./cmd/orbit-admin bootstrap \
|
|||||||
--application schedule-demo --namespace default --environment development \
|
--application schedule-demo --namespace default --environment development \
|
||||||
--queue snapshots --worker-access --schedule-access \
|
--queue snapshots --worker-access --schedule-access \
|
||||||
--output .local/schedule.credentials.json
|
--output .local/schedule.credentials.json
|
||||||
cd sdk/go
|
cd examples
|
||||||
ORBIT_URL=http://127.0.0.1:8080 \
|
ORBIT_URL=http://127.0.0.1:8080 \
|
||||||
ORBIT_CREDENTIALS_FILE=../../.local/schedule.credentials.json \
|
ORBIT_CREDENTIALS_FILE=../.local/schedule.credentials.json \
|
||||||
go run ./examples/schedules
|
go run ./schedules
|
||||||
```
|
```
|
||||||
|
|
||||||
前置数据库与目录步骤见 [SDK 接入](../sdk/README.md)。源码:[完整调度示例](../../sdk/go/examples/schedules/main.go)。示例创建暂停的每秒计划,恢复后让自动 Worker 返回对象输入快照,查询两次完成,再暂停并排空。计划本身有十秒结束边界,任务与历史保留;重复运行生成独立身份,不调用外部业务系统。
|
前置数据库与目录步骤见 [SDK 接入](../sdk/README.md)。源码:[完整调度示例](../../examples/schedules/main.go)。示例创建暂停的每秒计划,恢复后让自动 Worker 返回对象输入快照,查询两次完成,再暂停并排空。计划本身有十秒结束边界,任务与历史保留;重复运行生成独立身份,不调用外部业务系统。
|
||||||
|
|
||||||
```text
|
```text
|
||||||
source_kind=SCHEDULE fixed_version=1
|
source_kind=SCHEDULE fixed_version=1
|
||||||
|
|||||||
@@ -322,6 +322,6 @@ _, err = client.ConfigureSubscription(ctx, current.ID, pauseKey, orbit.Configure
|
|||||||
return err
|
return err
|
||||||
```
|
```
|
||||||
|
|
||||||
[完整管理示例](../../sdk/go/examples/subscriptions/main.go) 的启动、输入输出、失败和保留规则见 [场景文档](../examples/subscriptions.md)。它演示管理与幂等,不启动结果消费者。正式 [事件连接 SDK 与自动消费器](../sdk/event-consumer.md) 已提供接收、ACK、心跳、重连与有界收尾;[完整协议示例](../examples/event-protocol.md) 验证跨连接重报原确认。[独立 MySQL Inbox 示例](../examples/result-inbox.md) 已实现并验证消费者进程退出后的去重。
|
[完整管理示例](../../examples/subscriptions/main.go) 的启动、输入输出、失败和保留规则见 [场景文档](../examples/subscriptions.md)。它演示管理与幂等,不启动结果消费者。正式 [事件连接 SDK 与自动消费器](../sdk/event-consumer.md) 已提供接收、ACK、心跳、重连与有界收尾;[完整协议示例](../examples/event-protocol.md) 验证跨连接重报原确认。[独立 MySQL Inbox 示例](../examples/result-inbox.md) 已实现并验证消费者进程退出后的去重。
|
||||||
|
|
||||||
机器可读消息契约见 [events.schema.json](../../protocol/eventsv1/events.schema.json),使用 Draft 2020-12,clientFrame/serverFrame 分方向约束。运行时额外拒绝重复 JSON 键、超范围 uint64 及非规范 base64url。Schema 不代替授权、状态机、租约及事务校验。
|
机器可读消息契约见 [events.schema.json](../../protocol/eventsv1/events.schema.json),使用 Draft 2020-12,clientFrame/serverFrame 分方向约束。运行时额外拒绝重复 JSON 键、超范围 uint64 及非规范 base64url。Schema 不代替授权、状态机、租约及事务校验。
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ for {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
片段假设已有客户端及time.Time类型from/before;完整可运行源码见[示例](../../sdk/go/examples/task-query/main.go)。SDK校验ID、范围、状态、键长度/UTF-8及时间精度,并用url.Values编码,时间转UTC,不修改调用方时间对象。超时只影响读取,可保持条件重新请求;没有自动重试或自动翻页。
|
片段假设已有客户端及time.Time类型from/before;完整可运行源码见[示例](../../examples/task-query/main.go)。SDK校验ID、范围、状态、键长度/UTF-8及时间精度,并用url.Values编码,时间转UTC,不修改调用方时间对象。超时只影响读取,可保持条件重新请求;没有自动重试或自动翻页。
|
||||||
|
|
||||||
## 5. 存储、升级与边界
|
## 5. 存储、升级与边界
|
||||||
|
|
||||||
|
|||||||
@@ -132,10 +132,10 @@ SDK的ScheduleVersion为uint64,JSON仍为字符串;时间使用time.Time。S
|
|||||||
|
|
||||||
| 场景 | 完整源码 | 运行说明与新增输出 |
|
| 场景 | 完整源码 | 运行说明与新增输出 |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| 单项受理、取消后读取来源 | [tasks](../../sdk/go/examples/tasks/main.go) | [SDK初始化](../sdk/README.md),source_kind=DIRECT |
|
| 单项受理、取消后读取来源 | [tasks](../../examples/tasks/main.go) | [SDK初始化](../sdk/README.md),source_kind=DIRECT |
|
||||||
| 按计划找到触发任务,再反查来源 | [schedules](../../sdk/go/examples/schedules/main.go) | [计划场景](schedules.md#6-sdk-与完整示例),source_kind=SCHEDULE、fixed_version=1 |
|
| 按计划找到触发任务,再反查来源 | [schedules](../../examples/schedules/main.go) | [计划场景](schedules.md#6-sdk-与完整示例),source_kind=SCHEDULE、fixed_version=1 |
|
||||||
| 人工核查后创建关联新任务 | [recovery](../../sdk/go/examples/recovery/main.go) | [恢复场景](../examples/recovery.md),source_kind=MANUAL_RETRY、parent=原任务ID |
|
| 人工核查后创建关联新任务 | [recovery](../../examples/recovery/main.go) | [恢复场景](../examples/recovery.md),source_kind=MANUAL_RETRY、parent=原任务ID |
|
||||||
| 并行流程完成后核对每项任务来源 | [workflow](../../sdk/go/examples/workflow/main.go) | [流程场景](../examples/workflow.md),workflow_sources_verified=3、fixed_version=v1 |
|
| 并行流程完成后核对每项任务来源 | [workflow](../../examples/workflow/main.go) | [流程场景](../examples/workflow.md),workflow_sources_verified=3、fixed_version=v1 |
|
||||||
|
|
||||||
上述示例均运行在隔离回归中;新发布计划/流程版本后老任务仍指向原版本,人工恢复后旧激活仍可追溯。WORKFLOW是新增来源种类,旧SDK可能按未知种类返回错误;应升级SDK,不能降级为DIRECT。不更改Task/TaskSummary或Worker消息结构,不增加权限配置;新客户端调用旧节点的404/503同样不能理解为DIRECT。
|
上述示例均运行在隔离回归中;新发布计划/流程版本后老任务仍指向原版本,人工恢复后旧激活仍可追溯。WORKFLOW是新增来源种类,旧SDK可能按未知种类返回错误;应升级SDK,不能降级为DIRECT。不更改Task/TaskSummary或Worker消息结构,不增加权限配置;新客户端调用旧节点的404/503同样不能理解为DIRECT。
|
||||||
|
|
||||||
|
|||||||
@@ -203,4 +203,4 @@ SDK:`Client.CancelTask(ctx, taskID, key, request)`。此操作不承诺回滚
|
|||||||
{"request_id":"44444444444444444444444444444444","error":{"code":"IDEMPOTENCY_CONFLICT","message":"idempotency key was used with different content"}}
|
{"request_id":"44444444444444444444444444444444","error":{"code":"IDEMPOTENCY_CONFLICT","message":"idempotency key was used with different content"}}
|
||||||
```
|
```
|
||||||
|
|
||||||
有限自动重试已实现,具体分类、退避、回执和升级边界见 [安全重试](retries.md)。[运行中取消](cancellation.md) 已实现;[批量受理](batch-tasks.md) 已实现逐项结果与原身份补交;[独立任务核查与关联新任务重试](task-recovery.md) 已实现。[执行历史](execution-history.md) 已提供尝试与证据的列表和详情。完整可运行程序见 [SDK 任务示例](../../sdk/go/examples/tasks/main.go),已验证异常场景见 [P1 回归报告](../reports/phase-1.md) 及 [取消回归](../reports/phase-3-cancellation.md)。SDK 忽略未知响应字段;更改已有字段语义需升级契约和回归。
|
有限自动重试已实现,具体分类、退避、回执和升级边界见 [安全重试](retries.md)。[运行中取消](cancellation.md) 已实现;[批量受理](batch-tasks.md) 已实现逐项结果与原身份补交;[独立任务核查与关联新任务重试](task-recovery.md) 已实现。[执行历史](execution-history.md) 已提供尝试与证据的列表和详情。完整可运行程序见 [SDK 任务示例](../../examples/tasks/main.go),已验证异常场景见 [P1 回归报告](../reports/phase-1.md) 及 [取消回归](../reports/phase-3-cancellation.md)。SDK 忽略未知响应字段;更改已有字段语义需升级契约和回归。
|
||||||
|
|||||||
@@ -1,16 +1,18 @@
|
|||||||
# 通用场景示例
|
# 通用场景示例
|
||||||
|
|
||||||
|
完整源码已统一放在根目录 [examples/](../../examples/README.md),共有 27 个可运行场景;各目录 README 提供命令和预期结果。首次接入先看[仓库 README](../../README.md)。
|
||||||
|
|
||||||
示例只使用通用的作业、对象、文件、资源与审核信号,不包含接入方项目名称或行业规则。
|
示例只使用通用的作业、对象、文件、资源与审核信号,不包含接入方项目名称或行业规则。
|
||||||
|
|
||||||
## 已可运行:研发定义与发布流程
|
## 已可运行:研发定义与发布流程
|
||||||
|
|
||||||
- [完整命令和结果](workflow-definition.md)、[SDK源码](../../sdk/go/examples/workflow-definition/main.go)。
|
- [完整命令和结果](workflow-definition.md)、[SDK源码](../../examples/workflow-definition/main.go)。
|
||||||
- 六类节点的有限结构定义、原键及同版本确认、新版本发布、旧版本读取保持不变。
|
- 六类节点的有限结构定义、原键及同版本确认、新版本发布、旧版本读取保持不变。
|
||||||
- 本例只发布定义;实际运行见下方流程示例。
|
- 本例只发布定义;实际运行见下方流程示例。
|
||||||
|
|
||||||
## 已可运行:并行作业、定时等待与外部回执
|
## 已可运行:并行作业、定时等待与外部回执
|
||||||
|
|
||||||
- [完整命令、输入输出与失败处理](workflow.md)、[独立SDK源码](../../sdk/go/examples/workflow/main.go)。
|
- [完整命令、输入输出与失败处理](workflow.md)、[独立SDK源码](../../examples/workflow/main.go)。
|
||||||
- 两个任务并行处理并汇合,计时等待后接收显式目标代次的信号,再执行后续任务;最终三个任务完成并有界排空。
|
- 两个任务并行处理并汇合,计时等待后接收显式目标代次的信号,再执行后续任务;最终三个任务完成并有界排空。
|
||||||
- 启动及信号原键重复不会建立新的实例或信号;分页查看原状态事件,核对信号消费及赢家等待。
|
- 启动及信号原键重复不会建立新的实例或信号;分页查看原状态事件,核对信号消费及赢家等待。
|
||||||
|
|
||||||
@@ -32,13 +34,13 @@
|
|||||||
|
|
||||||
## 已可运行:相对延迟执行
|
## 已可运行:相对延迟执行
|
||||||
|
|
||||||
- [完整命令、输入输出和失败处理](delayed-task.md),[SDK源码](../../sdk/go/examples/delayed-task/main.go)。
|
- [完整命令、输入输出和失败处理](delayed-task.md),[SDK源码](../../examples/delayed-task/main.go)。
|
||||||
- delay_ms按数据库首次受理时间计时,实际Worker执行后查询开始时间;重报原请求仍返回原任务及时间。
|
- delay_ms按数据库首次受理时间计时,实际Worker执行后查询开始时间;重报原请求仍返回原任务及时间。
|
||||||
- 自动失败重试单独使用retry策略,初始延迟不在每次尝试中重新计时。
|
- 自动失败重试单独使用retry策略,初始延迟不在每次尝试中重新计时。
|
||||||
|
|
||||||
## 已可运行:健康检查
|
## 已可运行:健康检查
|
||||||
|
|
||||||
- 源码:[SDK 健康检查](../../sdk/go/examples/health/main.go)。
|
- 源码:[SDK 健康检查](../../examples/health/main.go)。
|
||||||
- 前置:已迁移的 MySQL 与已启动的基础服务。
|
- 前置:已迁移的 MySQL 与已启动的基础服务。
|
||||||
- 操作与预期输出:[SDK 接入说明](../sdk/README.md)。
|
- 操作与预期输出:[SDK 接入说明](../sdk/README.md)。
|
||||||
- 异常:数据库不可用或迁移记录异常时 readiness 返回 HTTP 503,SDK 返回类型化状态错误。
|
- 异常:数据库不可用或迁移记录异常时 readiness 返回 HTTP 503,SDK 返回类型化状态错误。
|
||||||
@@ -46,7 +48,7 @@
|
|||||||
|
|
||||||
## 已可运行:文件转换任务的受理与取消
|
## 已可运行:文件转换任务的受理与取消
|
||||||
|
|
||||||
- 源码:[SDK 任务受理示例](../../sdk/go/examples/tasks/main.go)。
|
- 源码:[SDK 任务受理示例](../../examples/tasks/main.go)。
|
||||||
- 前置:完成迁移、初始化凭据、启动服务,在没有 Worker 消费的专用队列运行此受理/取消示例,详见 [SDK 接入](../sdk/README.md)。
|
- 前置:完成迁移、初始化凭据、启动服务,在没有 Worker 消费的专用队列运行此受理/取消示例,详见 [SDK 接入](../sdk/README.md)。
|
||||||
- 输入:对象引用、格式与精确整数;提交两次同一身份,再查询、分页并带版本取消。
|
- 输入:对象引用、格式与精确整数;提交两次同一身份,再查询、分页并带版本取消。
|
||||||
- 预期:重复请求返回同一任务,最终 CANCELLED/revision=2,source_kind=DIRECT。当前不启动 Worker,不实际生成文件。
|
- 预期:重复请求返回同一任务,最终 CANCELLED/revision=2,source_kind=DIRECT。当前不启动 Worker,不实际生成文件。
|
||||||
@@ -55,7 +57,7 @@
|
|||||||
|
|
||||||
## 已可运行:文件格式转换执行
|
## 已可运行:文件格式转换执行
|
||||||
|
|
||||||
- 源码:[CSV→JSON Worker 示例](../../sdk/go/examples/file-conversion/main.go),[完整说明](file-conversion.md)。
|
- 源码:[CSV→JSON Worker 示例](../../examples/file-conversion/main.go),[完整说明](file-conversion.md)。
|
||||||
- 前置:专用 Worker 凭据、已启动服务和当前迁移;标准隔离回归会自动运行本例。
|
- 前置:专用 Worker 凭据、已启动服务和当前迁移;标准隔离回归会自动运行本例。
|
||||||
- 输入与步骤:提交带稳定操作键的两行 CSV 快照 → Worker 注册 `file.convert.csv-json` v1 → 领取、授权并转换 → 查询 JSON 结果 → 排空。
|
- 输入与步骤:提交带稳定操作键的两行 CSV 快照 → Worker 注册 `file.convert.csv-json` v1 → 领取、授权并转换 → 查询 JSON 结果 → 排空。
|
||||||
- 预期:`SUCCEEDED`、一次尝试、`records.json`、`rows=2`,重复提交仍沿用原任务身份。
|
- 预期:`SUCCEEDED`、一次尝试、`records.json`、`rows=2`,重复提交仍沿用原任务身份。
|
||||||
@@ -63,7 +65,7 @@
|
|||||||
|
|
||||||
## 已可运行:文本规范化执行
|
## 已可运行:文本规范化执行
|
||||||
|
|
||||||
- 源码:[Worker 底层协议示例](../../sdk/go/examples/worker-protocol/main.go)。
|
- 源码:[Worker 底层协议示例](../../examples/worker-protocol/main.go)。
|
||||||
- 前置:专用 Worker 凭据,启动步骤见 [Worker SDK 文档](../sdk/worker.md)。
|
- 前置:专用 Worker 凭据,启动步骤见 [Worker SDK 文档](../sdk/worker.md)。
|
||||||
- 输入与步骤:提交 `{"text":" Hello Orbit "}` → 注册/容量 → 领取 → 开始授权 → 实际处理 → 确认结果 → 查询 → 排空。
|
- 输入与步骤:提交 `{"text":" Hello Orbit "}` → 注册/容量 → 领取 → 开始授权 → 实际处理 → 确认结果 → 查询 → 排空。
|
||||||
- 预期:SUCCEEDED、一次尝试、结果 `{"text":"HELLO ORBIT"}`。
|
- 预期:SUCCEEDED、一次尝试、结果 `{"text":"HELLO ORBIT"}`。
|
||||||
@@ -72,7 +74,7 @@
|
|||||||
|
|
||||||
## 已可运行:自动 Worker 并发消费
|
## 已可运行:自动 Worker 并发消费
|
||||||
|
|
||||||
- 源码:[自动 Worker 示例](../../sdk/go/examples/worker/main.go),[接入与启动命令](../sdk/worker-runtime.md)。
|
- 源码:[自动 Worker 示例](../../examples/worker/main.go),[接入与启动命令](../sdk/worker-runtime.md)。
|
||||||
- 步骤:注册版本化处理器 → Run → 以容量 2 消费三条文本任务 → 查询结果 → 取消 Run context 并等待排空。
|
- 步骤:注册版本化处理器 → Run → 以容量 2 消费三条文本任务 → 查询结果 → 取消 Run context 并等待排空。
|
||||||
- 预期:三条规范化结果、started=3、confirmed=3、running=0;输入与结果均由实际代码处理。
|
- 预期:三条规范化结果、started=3、confirmed=3、running=0;输入与结果均由实际代码处理。
|
||||||
- 异常:自动心跳/续租与原身份重连;普通错误/panic 按未知效果报告,超时退出不声称杀死 goroutine;完整故障证据见 [回归记录](../reports/phase-2-worker-runtime.md)。
|
- 异常:自动心跳/续租与原身份重连;普通错误/panic 按未知效果报告,超时退出不声称杀死 goroutine;完整故障证据见 [回归记录](../reports/phase-2-worker-runtime.md)。
|
||||||
@@ -80,7 +82,7 @@
|
|||||||
|
|
||||||
## 已可运行:执行历史与冲突证据核对
|
## 已可运行:执行历史与冲突证据核对
|
||||||
|
|
||||||
- 源码:[执行历史示例](../../sdk/go/examples/history/main.go),[启动命令和输入输出](../sdk/README.md#6-查询执行历史与证据)。
|
- 源码:[执行历史示例](../../examples/history/main.go),[启动命令和输入输出](../sdk/README.md#6-查询执行历史与证据)。
|
||||||
- 前置:迁移到当前版本、启动服务,专用凭据具备提交/读取与 Worker 权限。
|
- 前置:迁移到当前版本、启动服务,专用凭据具备提交/读取与 Worker 权限。
|
||||||
- 步骤:创建模拟任务 → 开始授权 → 保存 v1 结果 → 用另一消息身份报告 v2 → 查询尝试/证据列表与详情 → 核对任务仍保留 v1。
|
- 步骤:创建模拟任务 → 开始授权 → 保存 v1 结果 → 用另一消息身份报告 v2 → 查询尝试/证据列表与详情 → 核对任务仍保留 v1。
|
||||||
- 预期:SUCCEEDED、attempts=1、evidence=1、reason=RESULT_CONFLICT、disposition=EVIDENCE_ONLY;实际结果中的大整数保持精确。
|
- 预期:SUCCEEDED、attempts=1、evidence=1、reason=RESULT_CONFLICT、disposition=EVIDENCE_ONLY;实际结果中的大整数保持精确。
|
||||||
@@ -89,7 +91,7 @@
|
|||||||
|
|
||||||
## 已可运行:有限安全重试
|
## 已可运行:有限安全重试
|
||||||
|
|
||||||
- 源码:[重试示例](../../sdk/go/examples/retry/main.go),[完整启动命令与结果](../api/retries.md#5-运行完整示例)。
|
- 源码:[重试示例](../../examples/retry/main.go),[完整启动命令与结果](../api/retries.md#5-运行完整示例)。
|
||||||
- 前置:当前迁移及服务,具有提交、读取和 Worker 权限的专用凭据。
|
- 前置:当前迁移及服务,具有提交、读取和 Worker 权限的专用凭据。
|
||||||
- 步骤:第一次在产生效果前模拟明确拒绝 → 平台持久化退避 → 第二次处理文本 → 查询两次尝试 → 排空。
|
- 步骤:第一次在产生效果前模拟明确拒绝 → 平台持久化退避 → 第二次处理文本 → 查询两次尝试 → 排空。
|
||||||
- 预期:SUCCEEDED、attempts=2、first_retryable=true、结果 `{"text":"SAFE RETRY"}`;Worker started=2、confirmed=2、running=0。
|
- 预期:SUCCEEDED、attempts=2、first_retryable=true、结果 `{"text":"SAFE RETRY"}`;Worker started=2、confirmed=2、running=0。
|
||||||
@@ -98,7 +100,7 @@
|
|||||||
|
|
||||||
## 已可运行:周期对象快照
|
## 已可运行:周期对象快照
|
||||||
|
|
||||||
- 源码:[调度示例](../../sdk/go/examples/schedules/main.go),[初始化、调用与输出](../api/schedules.md#6-sdk-与完整示例)。
|
- 源码:[调度示例](../../examples/schedules/main.go),[初始化、调用与输出](../api/schedules.md#6-sdk-与完整示例)。
|
||||||
- 前置:当前迁移、服务,显式 --schedule-access 与 --worker-access 的专用开发凭据。
|
- 前置:当前迁移、服务,显式 --schedule-access 与 --worker-access 的专用开发凭据。
|
||||||
- 步骤:创建暂停的有限每秒计划 → 恢复 → 自动 Worker 返回输入快照 → 查到至少两次任务成功 → 暂停并排空。
|
- 步骤:创建暂停的有限每秒计划 → 恢复 → 自动 Worker 返回输入快照 → 查到至少两次任务成功 → 暂停并排空。
|
||||||
- 预期:不同 occurrence/task 身份、相同计划版本、paused=true、running=0;精确整数保留。
|
- 预期:不同 occurrence/task 身份、相同计划版本、paused=true、running=0;精确整数保留。
|
||||||
@@ -107,7 +109,7 @@
|
|||||||
|
|
||||||
## 已可运行:运行中任务取消
|
## 已可运行:运行中任务取消
|
||||||
|
|
||||||
- 源码:[取消示例](../../sdk/go/examples/cancellation/main.go),[初始化、调用与输出](../api/cancellation.md)。
|
- 源码:[取消示例](../../examples/cancellation/main.go),[初始化、调用与输出](../api/cancellation.md)。
|
||||||
- 前置:当前迁移、全部服务节点升级完成,凭据具备任务提交/读取/取消和 Worker 权限。
|
- 前置:当前迁移、全部服务节点升级完成,凭据具备任务提交/读取/取消和 Worker 权限。
|
||||||
- 步骤:提交并开始受控任务 → 保存取消意图 → 处理器遵守 context 停止 → 明确确认本次无未结清效果 → 查询最终状态并排空。
|
- 步骤:提交并开始受控任务 → 保存取消意图 → 处理器遵守 context 停止 → 明确确认本次无未结清效果 → 查询最终状态并排空。
|
||||||
- 预期:accepted_state=RUNNING、final_state=CANCELLED、attempts=1、running=0。
|
- 预期:accepted_state=RUNNING、final_state=CANCELLED、attempts=1、running=0。
|
||||||
@@ -116,7 +118,7 @@
|
|||||||
|
|
||||||
## 已可运行:队列限速与积压背压
|
## 已可运行:队列限速与积压背压
|
||||||
|
|
||||||
- 源码:[资源控制示例](../../sdk/go/examples/resources/main.go),[初始化、字段与完整输出](../api/queues.md)。
|
- 源码:[资源控制示例](../../examples/resources/main.go),[初始化、字段与完整输出](../api/queues.md)。
|
||||||
- 前置:当前迁移与服务,凭据具备全部队列的 queues:manage、任务及 Worker 权限。
|
- 前置:当前迁移与服务,凭据具备全部队列的 queues:manage、任务及 Worker 权限。
|
||||||
- 步骤:创建并暂停积压上限为 2 的队列 → 第三个任务被 429 拒绝 → 满额下核对第一条原回执 → 取消释放空间 → 用被拒原身份再提交 → 恢复并按每秒 1 次开始执行。
|
- 步骤:创建并暂停积压上限为 2 的队列 → 第三个任务被 429 拒绝 → 满额下核对第一条原回执 → 取消释放空间 → 用被拒原身份再提交 → 恢复并按每秒 1 次开始执行。
|
||||||
- 预期:QUEUE_FULL、duplicate=true、两个任务 SUCCEEDED/attempts=1、unfinished=0。
|
- 预期:QUEUE_FULL、duplicate=true、两个任务 SUCCEEDED/attempts=1、unfinished=0。
|
||||||
@@ -125,7 +127,7 @@
|
|||||||
|
|
||||||
## 已可运行:跨命名空间共享配额
|
## 已可运行:跨命名空间共享配额
|
||||||
|
|
||||||
- 源码:[应用资源示例](../../sdk/go/examples/application-resources/main.go),[双命名空间初始化、字段和输出](../api/application-resources.md)。
|
- 源码:[应用资源示例](../../examples/application-resources/main.go),[双命名空间初始化、字段和输出](../api/application-resources.md)。
|
||||||
- 前置:同一独立、空闲示例应用下的两个命名空间,凭据显式具备应用资源管理权限;不需要 Worker。
|
- 前置:同一独立、空闲示例应用下的两个命名空间,凭据显式具备应用资源管理权限;不需要 Worker。
|
||||||
- 步骤:应用上限设为 1 → first 受理 → second 全局满额 → 取消 first → second 以原受理键成功 → 取消收尾并按 CAS 恢复配置。
|
- 步骤:应用上限设为 1 → first 受理 → second 全局满额 → 取消 first → second 以原受理键成功 → 取消收尾并按 CAS 恢复配置。
|
||||||
- 预期:APPLICATION_FULL/429、same_identity_retry_accepted=true、三个用量归零。
|
- 预期:APPLICATION_FULL/429、same_identity_retry_accepted=true、三个用量归零。
|
||||||
@@ -134,9 +136,9 @@
|
|||||||
|
|
||||||
## 计划场景与验收标准
|
## 计划场景与验收标准
|
||||||
|
|
||||||
已可运行的 [优先级场景](../api/priority-and-fairness.md#4-sdk-完整场景) 提供 [完整源码](../../sdk/go/examples/priority/main.go):按 0、9、4 受理后,以单槽 Worker 按 9、4、0 完成近同时到期的任务。前置为当前迁移/服务与队列、任务及 Worker 权限;预期 completed=3、attempts_per_task=1、worker_drained=true。无外部业务副作用,历史保留,失败非零退出,任务自带总时限;长等待补偿和其他应用隔离由真实数据库回归验证。
|
已可运行的 [优先级场景](../api/priority-and-fairness.md#4-sdk-完整场景) 提供 [完整源码](../../examples/priority/main.go):按 0、9、4 受理后,以单槽 Worker 按 9、4、0 完成近同时到期的任务。前置为当前迁移/服务与队列、任务及 Worker 权限;预期 completed=3、attempts_per_task=1、worker_drained=true。无外部业务副作用,历史保留,失败非零退出,任务自带总时限;长等待补偿和其他应用隔离由真实数据库回归验证。
|
||||||
|
|
||||||
已可运行的 [跨队列资源互斥场景](../api/keyed-concurrency.md#5-完整可运行场景) 提供 [完整源码](../../sdk/go/examples/keyed-concurrency/main.go):两个队列的自动 Worker 操作同一资源,核对递增序号,并模拟资源端拒绝旧写入。输入使用显式 concurrency_key;预期 completed=2、resource_writes=2、stale_write_rejected=true。示例仅使用受控内存资源,无外部副作用;正常排空、保留历史,任务自带总时限。内存 mutex 不是生产分布式存储,生产必须在资源端原子持久化序号、操作身份和实际更新。
|
已可运行的 [跨队列资源互斥场景](../api/keyed-concurrency.md#5-完整可运行场景) 提供 [完整源码](../../examples/keyed-concurrency/main.go):两个队列的自动 Worker 操作同一资源,核对递增序号,并模拟资源端拒绝旧写入。输入使用显式 concurrency_key;预期 completed=2、resource_writes=2、stale_write_rejected=true。示例仅使用受控内存资源,无外部副作用;正常排空、保留历史,任务自带总时限。内存 mutex 不是生产分布式存储,生产必须在资源端原子持久化序号、操作身份和实际更新。
|
||||||
|
|
||||||
| 场景 | 输入与步骤 | 预期结果 | 必测异常 | 状态 |
|
| 场景 | 输入与步骤 | 预期结果 | 必测异常 | 状态 |
|
||||||
| --- | --- | --- | --- | --- |
|
| --- | --- | --- | --- | --- |
|
||||||
@@ -151,7 +153,7 @@
|
|||||||
|
|
||||||
## 已可运行:订阅管理与幂等回执
|
## 已可运行:订阅管理与幂等回执
|
||||||
|
|
||||||
- 源码:[订阅管理示例](../../sdk/go/examples/subscriptions/main.go),[启动、输入输出和异常说明](subscriptions.md)。
|
- 源码:[订阅管理示例](../../examples/subscriptions/main.go),[启动、输入输出和异常说明](subscriptions.md)。
|
||||||
- 前置:当前迁移及服务,具备 events:manage/read/consume 的专用开发凭据;初始化显式 --event-access。
|
- 前置:当前迁移及服务,具备 events:manage/read/consume 的专用开发凭据;初始化显式 --event-access。
|
||||||
- 步骤:创建 → 同键核对 → 暂停 → 恢复 → 查询与分页 → 最终暂停。
|
- 步骤:创建 → 同键核对 → 暂停 → 恢复 → 查询与分页 → 最终暂停。
|
||||||
- 预期:duplicate=true、resumed_revision=3、final_enabled=false、revision=4、pending=0。
|
- 预期:duplicate=true、resumed_revision=3、final_enabled=false、revision=4、pending=0。
|
||||||
@@ -160,7 +162,7 @@
|
|||||||
|
|
||||||
## 已可运行:结果消费协议与跨连接确认
|
## 已可运行:结果消费协议与跨连接确认
|
||||||
|
|
||||||
- 源码:[事件协议示例](../../sdk/go/examples/event-protocol/main.go),[启动与输出说明](event-protocol.md)。
|
- 源码:[事件协议示例](../../examples/event-protocol/main.go),[启动与输出说明](event-protocol.md)。
|
||||||
- 操作:创建订阅 → 提交并取消任务 → 接收冻结结果 → ACK → 重连重报原证明 → 核对原确认时间 → 暂停订阅。
|
- 操作:创建订阅 → 提交并取消任务 → 接收冻结结果 → ACK → 重连重报原证明 → 核对原确认时间 → 暂停订阅。
|
||||||
- 输出:ack_replayed=true、same_receipt=true、pending=0、subscription_enabled=false。
|
- 输出:ack_replayed=true、same_receipt=true、pending=0、subscription_enabled=false。
|
||||||
- 范围:本例只做读取验证,不写业务数据;[自动消费器](../sdk/event-consumer.md) 的生产接入须提供事务Inbox,不能把示例当作业务恰好一次保证。
|
- 范围:本例只做读取验证,不写业务数据;[自动消费器](../sdk/event-consumer.md) 的生产接入须提供事务Inbox,不能把示例当作业务恰好一次保证。
|
||||||
@@ -175,7 +177,7 @@
|
|||||||
|
|
||||||
## 已可运行:批量受理与部分补交
|
## 已可运行:批量受理与部分补交
|
||||||
|
|
||||||
- 源码:[batch](../../sdk/go/examples/batch/main.go),[完整启动命令和输出](batch.md)。
|
- 源码:[batch](../../examples/batch/main.go),[完整启动命令和输出](batch.md)。
|
||||||
- 步骤:独立暂停队列 → 三项批量提交、两项成功一项满额 → 整批核对原回执 → 取消释放额度 → 仅原身份补交第三项 → 取消收尾。
|
- 步骤:独立暂停队列 → 三项批量提交、两项成功一项满额 → 整批核对原回执 → 取消释放额度 → 仅原身份补交第三项 → 取消收尾。
|
||||||
- 预期:accepted=2、replayed=2、retried_items=1、unfinished=0。
|
- 预期:accepted=2、replayed=2、retried_items=1、unfinished=0。
|
||||||
- 异常:逐项区分REJECTED/UNKNOWN/NOT_ATTEMPTED;真实HTTP响应丢失后恢复无重复,保留当前权限和额度控制。
|
- 异常:逐项区分REJECTED/UNKNOWN/NOT_ATTEMPTED;真实HTTP响应丢失后恢复无重复,保留当前权限和额度控制。
|
||||||
@@ -183,7 +185,7 @@
|
|||||||
|
|
||||||
## 已可运行:独立任务人工核查与关联重试
|
## 已可运行:独立任务人工核查与关联重试
|
||||||
|
|
||||||
- 源码:[recovery](../../sdk/go/examples/recovery/main.go),[完整运行与失败说明](recovery.md)。
|
- 源码:[recovery](../../examples/recovery/main.go),[完整运行与失败说明](recovery.md)。
|
||||||
- 步骤:模拟UNKNOWN → 人工声明历史执行结束 → 核查FAILED → 原键核对 → 创建retry_of关联新任务 → 执行成功 → 查询原任务及操作审计。
|
- 步骤:模拟UNKNOWN → 人工声明历史执行结束 → 核查FAILED → 原键核对 → 创建retry_of关联新任务 → 执行成功 → 查询原任务及操作审计。
|
||||||
- 预期:原任务FAILED、新任务SUCCEEDED,原尝试和审计保留;管理凭据显式--recovery-access。
|
- 预期:原任务FAILED、新任务SUCCEEDED,原尝试和审计保留;管理凭据显式--recovery-access。
|
||||||
- 异常:真实HTTP在核查/重试提交后丢响应,原身份恢复同一审计和新任务;迟到成功只进入证据。
|
- 异常:真实HTTP在核查/重试提交后丢响应,原身份恢复同一审计和新任务;迟到成功只进入证据。
|
||||||
@@ -191,7 +193,7 @@
|
|||||||
|
|
||||||
## 已可运行:业务键和创建时间查询
|
## 已可运行:业务键和创建时间查询
|
||||||
|
|
||||||
- 源码:[task-query](../../sdk/go/examples/task-query/main.go),[完整启动与异常说明](task-query.md)。
|
- 源码:[task-query](../../examples/task-query/main.go),[完整启动与异常说明](task-query.md)。
|
||||||
- 步骤:提交三个模拟任务 → 精确业务键及时间范围过滤 → 每页一条遍历 → 验证上界排除 → 取消收尾。
|
- 步骤:提交三个模拟任务 → 精确业务键及时间范围过滤 → 每页一条遍历 → 验证上界排除 → 取消收尾。
|
||||||
- 预期:matched=2、pages=2、before_excluded=true、cancelled=3。
|
- 预期:matched=2、pages=2、before_excluded=true、cancelled=3。
|
||||||
- 范围:普通提交/读取/取消权限;不调用外部系统、不启动Worker,所有历史保留,状态分页不是数据库快照。
|
- 范围:普通提交/读取/取消权限;不调用外部系统、不启动Worker,所有历史保留,状态分页不是数据库快照。
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# 批量文件作业受理与部分补交
|
# 批量文件作业受理与部分补交
|
||||||
|
|
||||||
[完整源码](../../sdk/go/examples/batch/main.go) 使用独立Go SDK,不导入服务端模型或数据库驱动。它演示受理与取消,不启动Worker或转换真实文件。
|
[完整源码](../../examples/batch/main.go) 使用独立Go SDK,不导入服务端模型或数据库驱动。它演示受理与取消,不启动Worker或转换真实文件。
|
||||||
|
|
||||||
## 前置与运行
|
## 前置与运行
|
||||||
|
|
||||||
@@ -21,10 +21,10 @@ go run ./cmd/orbit
|
|||||||
另开终端:
|
另开终端:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cd sdk/go
|
cd examples
|
||||||
ORBIT_URL=http://127.0.0.1:8080 \
|
ORBIT_URL=http://127.0.0.1:8080 \
|
||||||
ORBIT_CREDENTIALS_FILE=../../.local/batch.credentials.json \
|
ORBIT_CREDENTIALS_FILE=../.local/batch.credentials.json \
|
||||||
go run ./examples/batch
|
go run ./batch
|
||||||
```
|
```
|
||||||
|
|
||||||
也接受ORBIT_TOKEN,环境值优先。示例自行创建并暂停一个独立队列,未终结上限为2,不改变已有队列或应用配置。前置应用剩余额度至少2。
|
也接受ORBIT_TOKEN,环境值优先。示例自行创建并暂停一个独立队列,未终结上限为2,不改变已有队列或应用配置。前置应用剩余额度至少2。
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
# 相对延迟与原请求恢复
|
# 相对延迟与原请求恢复
|
||||||
|
|
||||||
源码:[delayed-task/main.go](../../sdk/go/examples/delayed-task/main.go)。示例提交等待1500毫秒的对象任务,启动自动Worker,核对实际执行历史,再在任务完成后重报原请求。处理器原样返回示例JSON,无外部副作用。
|
源码:[delayed-task/main.go](../../examples/delayed-task/main.go)。示例提交等待1500毫秒的对象任务,启动自动Worker,核对实际执行历史,再在任务完成后重报原请求。处理器原样返回示例JSON,无外部副作用。
|
||||||
|
|
||||||
## 准备与运行
|
## 准备与运行
|
||||||
|
|
||||||
先完成[迁移和Worker凭据初始化](../sdk/worker.md#1-可运行的文本规范化示例),启动当前Orbit。凭据需要任务提交、读取及Worker连接/消费权限,队列须有可用额度。仓库根目录执行:
|
先完成[迁移和Worker凭据初始化](../sdk/worker.md#1-可运行的文本规范化示例),启动当前Orbit。凭据需要任务提交、读取及Worker连接/消费权限,队列须有可用额度。仓库根目录执行:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cd sdk/go
|
cd examples
|
||||||
ORBIT_URL=http://127.0.0.1:8080 \
|
ORBIT_URL=http://127.0.0.1:8080 \
|
||||||
ORBIT_CREDENTIALS_FILE=../../.local/worker.credentials.json \
|
ORBIT_CREDENTIALS_FILE=../.local/worker.credentials.json \
|
||||||
go run ./examples/delayed-task
|
go run ./delayed-task
|
||||||
```
|
```
|
||||||
|
|
||||||
也可用ORBIT_TOKEN和ORBIT_QUEUE_ID覆盖凭据文件中的对应值。示例总上下文20秒、任务总时限15秒、单次执行5秒、最多1次尝试;每次运行使用独立操作及处理器身份,不会消费其他处理器的任务。
|
也可用ORBIT_TOKEN和ORBIT_QUEUE_ID覆盖凭据文件中的对应值。示例总上下文20秒、任务总时限15秒、单次执行5秒、最多1次尝试;每次运行使用独立操作及处理器身份,不会消费其他处理器的任务。
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# 结果消费协议示例
|
# 结果消费协议示例
|
||||||
|
|
||||||
[完整代码](../../sdk/go/examples/event-protocol/main.go) 使用正式 Go SDK 创建取消结果订阅,提交并取消一个待执行任务,接收并验证冻结结果,然后 ACK;关闭连接后在新连接中重报原证明,验证原确认时间和去重回执,最后暂停本次订阅。
|
[完整代码](../../examples/event-protocol/main.go) 使用正式 Go SDK 创建取消结果订阅,提交并取消一个待执行任务,接收并验证冻结结果,然后 ACK;关闭连接后在新连接中重报原证明,验证原确认时间和去重回执,最后暂停本次订阅。
|
||||||
|
|
||||||
本例只读取并验证结果,没有业务数据库写入。生产业务应使用 [自动消费器及事务去重约定](../sdk/event-consumer.md)。持久化接入见 [独立 MySQL Inbox 示例](result-inbox.md)。
|
本例只读取并验证结果,没有业务数据库写入。生产业务应使用 [自动消费器及事务去重约定](../sdk/event-consumer.md)。持久化接入见 [独立 MySQL Inbox 示例](result-inbox.md)。
|
||||||
|
|
||||||
@@ -8,12 +8,13 @@
|
|||||||
|
|
||||||
先按 [订阅管理示例](subscriptions.md) 建立隔离示例队列和带 --event-access 的凭据,启动 Orbit。凭据需要 tasks:submit、tasks:cancel、events:manage/read/consume 及该队列范围;订阅绑定创建凭据,不能临时换凭据消费。
|
先按 [订阅管理示例](subscriptions.md) 建立隔离示例队列和带 --event-access 的凭据,启动 Orbit。凭据需要 tasks:submit、tasks:cancel、events:manage/read/consume 及该队列范围;订阅绑定创建凭据,不能临时换凭据消费。
|
||||||
|
|
||||||
从 sdk/go 目录运行:
|
从仓库根目录进入 examples 后运行:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
|
cd examples
|
||||||
ORBIT_URL=http://127.0.0.1:8080 \
|
ORBIT_URL=http://127.0.0.1:8080 \
|
||||||
ORBIT_CREDENTIALS_FILE=../../.local/event.credentials.json \
|
ORBIT_CREDENTIALS_FILE=../.local/event.credentials.json \
|
||||||
go run ./examples/event-protocol
|
go run ./event-protocol
|
||||||
```
|
```
|
||||||
|
|
||||||
也可以传 ORBIT_TOKEN 与 ORBIT_QUEUE_ID,环境变量覆盖凭据文件对应值。每次运行新建随机订阅及任务身份,全部流程最多 15 秒。本例是短流程,两个连接均短于一次心跳周期;长期运行必须用自动消费器或主动 Ping。
|
也可以传 ORBIT_TOKEN 与 ORBIT_QUEUE_ID,环境变量覆盖凭据文件对应值。每次运行新建随机订阅及任务身份,全部流程最多 15 秒。本例是短流程,两个连接均短于一次心跳周期;长期运行必须用自动消费器或主动 Ping。
|
||||||
|
|||||||
@@ -7,10 +7,10 @@
|
|||||||
需要当前迁移、已启动 Orbit 服务,以及具备任务提交/读取和 Worker 消费权限的专用凭据。凭据文件应只保存在本地受保护目录:
|
需要当前迁移、已启动 Orbit 服务,以及具备任务提交/读取和 Worker 消费权限的专用凭据。凭据文件应只保存在本地受保护目录:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cd sdk/go
|
cd examples
|
||||||
ORBIT_URL=http://127.0.0.1:8080 \
|
ORBIT_URL=http://127.0.0.1:8080 \
|
||||||
ORBIT_CREDENTIALS_FILE=../../.local/worker.credentials.json \
|
ORBIT_CREDENTIALS_FILE=../.local/worker.credentials.json \
|
||||||
go run ./examples/file-conversion
|
go run ./file-conversion
|
||||||
```
|
```
|
||||||
|
|
||||||
## 调用链与预期
|
## 调用链与预期
|
||||||
@@ -50,8 +50,8 @@ input=records.csv output=records.json rows=2 state=SUCCEEDED worker_drained=true
|
|||||||
单元转换校验:
|
单元转换校验:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cd sdk/go
|
cd examples
|
||||||
GOWORK=off go test ./examples/file-conversion
|
GOWORK=off go test ./file-conversion
|
||||||
```
|
```
|
||||||
|
|
||||||
`make integration` 会在一次性 MySQL 和真实 Orbit HTTP 服务上运行该示例,确认提交、Worker 执行、结果查询和排空均通过。该场景不证明外部对象存储的持久性,也不替代生产容量、故障切换或 RPO/RTO 验收。
|
`make integration` 会在一次性 MySQL 和真实 Orbit HTTP 服务上运行该示例,确认提交、Worker 执行、结果查询和排空均通过。该场景不证明外部对象存储的持久性,也不替代生产容量、故障切换或 RPO/RTO 验收。
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# 未知结果的核查与人工重试示例
|
# 未知结果的核查与人工重试示例
|
||||||
|
|
||||||
完整源码:[SDK recovery/main.go](../../sdk/go/examples/recovery/main.go)。只处理本地模拟对象,不调用任何真实外部业务系统。接口细节见[人工恢复手册](../api/task-recovery.md)。
|
完整源码:[SDK recovery/main.go](../../examples/recovery/main.go)。只处理本地模拟对象,不调用任何真实外部业务系统。接口细节见[人工恢复手册](../api/task-recovery.md)。
|
||||||
|
|
||||||
## 准备与运行
|
## 准备与运行
|
||||||
|
|
||||||
@@ -20,10 +20,10 @@ go run ./cmd/orbit
|
|||||||
另开终端,从仓库根目录执行:
|
另开终端,从仓库根目录执行:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cd sdk/go
|
cd examples
|
||||||
ORBIT_URL=http://127.0.0.1:8080 \
|
ORBIT_URL=http://127.0.0.1:8080 \
|
||||||
ORBIT_CREDENTIALS_FILE=../../.local/recovery.credentials.json \
|
ORBIT_CREDENTIALS_FILE=../.local/recovery.credentials.json \
|
||||||
go run ./examples/recovery
|
go run ./recovery
|
||||||
```
|
```
|
||||||
|
|
||||||
演示凭据为了完整运行同时包含Worker与人工管理权限;生产将它们分开。凭据文件0600、token不输出;也接受ORBIT_TOKEN/ORBIT_QUEUE_ID,环境值优先。
|
演示凭据为了完整运行同时包含Worker与人工管理权限;生产将它们分开。凭据文件0600、token不输出;也接受ORBIT_TOKEN/ORBIT_QUEUE_ID,环境值优先。
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# 订阅管理与幂等回执示例
|
# 订阅管理与幂等回执示例
|
||||||
|
|
||||||
状态:已提供 [完整可运行源码](../../sdk/go/examples/subscriptions/main.go)。演示 HTTP 管理 SDK;完整结果消费、重连及持久化 Inbox 示例继续开发。协议与字段见 [订阅接口](../api/subscriptions.md)。
|
状态:已提供 [完整可运行源码](../../examples/subscriptions/main.go)。演示 HTTP 管理 SDK;完整结果消费、重连及持久化 Inbox 示例继续开发。协议与字段见 [订阅接口](../api/subscriptions.md)。
|
||||||
|
|
||||||
## 前置和运行
|
## 前置和运行
|
||||||
|
|
||||||
@@ -19,10 +19,10 @@ go run ./cmd/orbit
|
|||||||
另一个终端从仓库根目录执行:
|
另一个终端从仓库根目录执行:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cd sdk/go
|
cd examples
|
||||||
ORBIT_URL=http://127.0.0.1:8080 \
|
ORBIT_URL=http://127.0.0.1:8080 \
|
||||||
ORBIT_CREDENTIALS_FILE=../../.local/subscriptions.credentials.json \
|
ORBIT_CREDENTIALS_FILE=../.local/subscriptions.credentials.json \
|
||||||
go run ./examples/subscriptions
|
go run ./subscriptions
|
||||||
```
|
```
|
||||||
|
|
||||||
也可设置 ORBIT_TOKEN 和 ORBIT_QUEUE_ID,环境值优先于凭据文件。生产接入使用 HTTPS;不要提交凭据文件或在命令行打印秘密。
|
也可设置 ORBIT_TOKEN 和 ORBIT_QUEUE_ID,环境值优先于凭据文件。生产接入使用 HTTPS;不要提交凭据文件或在命令行打印秘密。
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
# 业务键与时间范围查询示例
|
# 业务键与时间范围查询示例
|
||||||
|
|
||||||
源码:[task-query/main.go](../../sdk/go/examples/task-query/main.go)。本例提交三个模拟对象任务,不启动Worker,演示精确业务键、创建时间区间和任务摘要分页。
|
源码:[task-query/main.go](../../examples/task-query/main.go)。本例提交三个模拟对象任务,不启动Worker,演示精确业务键、创建时间区间和任务摘要分页。
|
||||||
|
|
||||||
## 准备与运行
|
## 准备与运行
|
||||||
|
|
||||||
按[SDK初始化步骤](../sdk/README.md)迁移数据库、初始化专用开发队列及普通提交/读取/取消凭据,启动当前Orbit服务。从仓库根目录执行:
|
按[SDK初始化步骤](../sdk/README.md)迁移数据库、初始化专用开发队列及普通提交/读取/取消凭据,启动当前Orbit服务。从仓库根目录执行:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cd sdk/go
|
cd examples
|
||||||
ORBIT_URL=http://127.0.0.1:8080 \
|
ORBIT_URL=http://127.0.0.1:8080 \
|
||||||
ORBIT_CREDENTIALS_FILE=../../.local/development.credentials.json \
|
ORBIT_CREDENTIALS_FILE=../.local/development.credentials.json \
|
||||||
go run ./examples/task-query
|
go run ./task-query
|
||||||
```
|
```
|
||||||
|
|
||||||
也可使用ORBIT_TOKEN与ORBIT_QUEUE_ID,环境值优先。无需额外管理权限,凭据秘密不输出。队列应有至少三个未终结任务空位;每次运行的处理器与业务键带独立标识,避免已有任务干扰。
|
也可使用ORBIT_TOKEN与ORBIT_QUEUE_ID,环境值优先。无需额外管理权限,凭据秘密不输出。队列应有至少三个未终结任务空位;每次运行的处理器与业务键带独立标识,避免已有任务干扰。
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
本例运行真实HTTP发布与读取,验证六种节点的格式以及不可变版本。当前不创建流程实例、不执行外部业务。实际运行另见[并行作业与回执示例](workflow.md)。
|
本例运行真实HTTP发布与读取,验证六种节点的格式以及不可变版本。当前不创建流程实例、不执行外部业务。实际运行另见[并行作业与回执示例](workflow.md)。
|
||||||
|
|
||||||
源码:[workflow-definition/main.go](../../sdk/go/examples/workflow-definition/main.go)。接口:[定义发布](../api/workflow-definitions.md);字段规范:[结构版本1](../api/workflow-definition-format.md)。
|
源码:[workflow-definition/main.go](../../examples/workflow-definition/main.go)。接口:[定义发布](../api/workflow-definitions.md);字段规范:[结构版本1](../api/workflow-definition-format.md)。
|
||||||
|
|
||||||
## 1. 准备与运行
|
## 1. 准备与运行
|
||||||
|
|
||||||
@@ -15,11 +15,11 @@ bin/orbit-admin bootstrap --application definition-demo --namespace default --en
|
|||||||
首次创建文件后保留,不要覆盖或打印凭据内容。该标志只增加定义读取和发布动作;生产凭据应限制到需要的命名空间及队列。
|
首次创建文件后保留,不要覆盖或打印凭据内容。该标志只增加定义读取和发布动作;生产凭据应限制到需要的命名空间及队列。
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cd sdk/go
|
cd examples
|
||||||
ORBIT_URL=http://127.0.0.1:8080 \
|
ORBIT_URL=http://127.0.0.1:8080 \
|
||||||
ORBIT_CREDENTIALS_FILE=/tmp/orbit-definition.credentials.json \
|
ORBIT_CREDENTIALS_FILE=/tmp/orbit-definition.credentials.json \
|
||||||
ORBIT_OPERATION_ID=object-definition-demo-001 \
|
ORBIT_OPERATION_ID=object-definition-demo-001 \
|
||||||
go run ./examples/workflow-definition
|
go run ./workflow-definition
|
||||||
```
|
```
|
||||||
|
|
||||||
开发回环地址可用HTTP,生产使用HTTPS。可改用`ORBIT_TOKEN`及`ORBIT_QUEUE_ID`,不把Token写入URL或提交版本库。不传`ORBIT_OPERATION_ID`时随机生成并先输出;发生未知结果时保存此操作ID,保持相同队列及源码再次运行。已成功的相同操作ID也可以重复执行,旧版本与revision不会增加。
|
开发回环地址可用HTTP,生产使用HTTPS。可改用`ORBIT_TOKEN`及`ORBIT_QUEUE_ID`,不把Token写入URL或提交版本库。不传`ORBIT_OPERATION_ID`时随机生成并先输出;发生未知结果时保存此操作ID,保持相同队列及源码再次运行。已成功的相同操作ID也可以重复执行,旧版本与revision不会增加。
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# 有界轮询:请求重试与业务轮次分别计数
|
# 有界轮询:请求重试与业务轮次分别计数
|
||||||
|
|
||||||
[完整源码](../../sdk/go/examples/workflow-poll/main.go)通过公共SDK发布POLL定义,启动真实Worker,并请求一个本机HTTP渠道夹具。流程先由TASK向本机渠道提交一次作业,受理回执提供固定operation_id,随后POLL只查询这个作业;平台没有集成任何具体业务渠道。
|
[完整源码](../../examples/workflow-poll/main.go)通过公共SDK发布POLL定义,启动真实Worker,并请求一个本机HTTP渠道夹具。流程先由TASK向本机渠道提交一次作业,受理回执提供固定operation_id,随后POLL只查询这个作业;平台没有集成任何具体业务渠道。
|
||||||
|
|
||||||
同一命令依次运行两个流程:
|
同一命令依次运行两个流程:
|
||||||
|
|
||||||
@@ -27,10 +27,10 @@ go run ./cmd/orbit
|
|||||||
bootstrap只执行一次,凭据文件存在时不会覆盖。另开终端,从仓库根目录运行:
|
bootstrap只执行一次,凭据文件存在时不会覆盖。另开终端,从仓库根目录运行:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cd sdk/go
|
cd examples
|
||||||
ORBIT_URL=http://127.0.0.1:8080 \
|
ORBIT_URL=http://127.0.0.1:8080 \
|
||||||
ORBIT_CREDENTIALS_FILE=../../.local/poll.credentials.json \
|
ORBIT_CREDENTIALS_FILE=../.local/poll.credentials.json \
|
||||||
go run ./examples/workflow-poll
|
go run ./workflow-poll
|
||||||
```
|
```
|
||||||
|
|
||||||
程序自行创建并关闭本机HTTP夹具,不需要启动第三方系统,不向公网提交操作。正式接入使用HTTPS/WSS和分角色凭据,将只读查询处理器替换为自己的渠道调用。
|
程序自行创建并关闭本机HTTP夹具,不需要启动第三方系统,不向公网提交操作。正式接入使用HTTPS/WSS和分角色凭据,将只读查询处理器替换为自己的渠道调用。
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
场景:一个对象关联多次处理流程,管理端需要按固定定义版本、精确业务关联及时间范围查询等待中的实例,再进入详情处理。示例同时证明业务键末尾有无空格属于不同关联。
|
场景:一个对象关联多次处理流程,管理端需要按固定定义版本、精确业务关联及时间范围查询等待中的实例,再进入详情处理。示例同时证明业务键末尾有无空格属于不同关联。
|
||||||
|
|
||||||
源码:[workflow-query/main.go](../../sdk/go/examples/workflow-query/main.go)。服务端入口:[筛选接口](../api/workflow-queries.md)。示例发布一个SIGNAL等待流程,创建三个实例,其中两个使用相同业务键、第三个去掉尾部空格;每页1项读取匹配的两个实例,最后将三个实例取消并等待CANCELLED。
|
源码:[workflow-query/main.go](../../examples/workflow-query/main.go)。服务端入口:[筛选接口](../api/workflow-queries.md)。示例发布一个SIGNAL等待流程,创建三个实例,其中两个使用相同业务键、第三个去掉尾部空格;每页1项读取匹配的两个实例,最后将三个实例取消并等待CANCELLED。
|
||||||
|
|
||||||
## 启动
|
## 启动
|
||||||
|
|
||||||
@@ -22,10 +22,10 @@ go run ./cmd/orbit
|
|||||||
另开终端:
|
另开终端:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cd sdk/go
|
cd examples
|
||||||
ORBIT_URL=http://127.0.0.1:8080 \
|
ORBIT_URL=http://127.0.0.1:8080 \
|
||||||
ORBIT_CREDENTIALS_FILE=../../.local/workflow-query.credentials.json \
|
ORBIT_CREDENTIALS_FILE=../.local/workflow-query.credentials.json \
|
||||||
go run ./examples/workflow-query
|
go run ./workflow-query
|
||||||
```
|
```
|
||||||
|
|
||||||
查询本身只要求workflows:read。此完整示例额外需要研发创建/发布、启动与控制权限,由上述bootstrap选项授予。SIGNAL等待不用Worker,也不模拟外部业务成功;正常结束通过显式取消结清。
|
查询本身只要求workflows:read。此完整示例额外需要研发创建/发布、启动与控制权限,由上述bootstrap选项授予。SIGNAL等待不用Worker,也不模拟外部业务成功;正常结束通过显式取消结清。
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# 提交后回执丢失:核查、暂停与有证据恢复
|
# 提交后回执丢失:核查、暂停与有证据恢复
|
||||||
|
|
||||||
[完整源码](../../sdk/go/examples/workflow-recovery/main.go)使用真实Orbit、自动Worker和本机HTTP渠道夹具。夹具先保存外部提交结果,再直接关闭连接,确保Worker实际遇到传输错误。流程进入NEEDS_REVIEW后,程序在受控夹具中模拟一个已经核实事实的管理员,逐项提交恢复决定。
|
[完整源码](../../examples/workflow-recovery/main.go)使用真实Orbit、自动Worker和本机HTTP渠道夹具。夹具先保存外部提交结果,再直接关闭连接,确保Worker实际遇到传输错误。流程进入NEEDS_REVIEW后,程序在受控夹具中模拟一个已经核实事实的管理员,逐项提交恢复决定。
|
||||||
|
|
||||||
这是一份可运行的SDK接入与故障示例。夹具数据仅在本次进程内保存;真实系统需要持久证据和真实授权,不能把下面的演示核查逻辑接成任意业务的自动放行。
|
这是一份可运行的SDK接入与故障示例。夹具数据仅在本次进程内保存;真实系统需要持久证据和真实授权,不能把下面的演示核查逻辑接成任意业务的自动放行。
|
||||||
|
|
||||||
@@ -23,10 +23,10 @@ go run ./cmd/orbit
|
|||||||
初始化一次;原凭据文件不会被覆盖。另开终端,从仓库根目录运行:
|
初始化一次;原凭据文件不会被覆盖。另开终端,从仓库根目录运行:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cd sdk/go
|
cd examples
|
||||||
ORBIT_URL=http://127.0.0.1:8080 \
|
ORBIT_URL=http://127.0.0.1:8080 \
|
||||||
ORBIT_CREDENTIALS_FILE=../../.local/workflow-recovery.credentials.json \
|
ORBIT_CREDENTIALS_FILE=../.local/workflow-recovery.credentials.json \
|
||||||
go run ./examples/workflow-recovery
|
go run ./workflow-recovery
|
||||||
```
|
```
|
||||||
|
|
||||||
开发凭据包含定义、启动、Worker、控制、恢复及审计权限,便于单命令演示。正式接入应使用HTTPS/WSS,并为业务Worker与管理员分别签发所需权限;Worker执行权不自动授予恢复权。
|
开发凭据包含定义、启动、Worker、控制、恢复及审计权限,便于单命令演示。正式接入应使用HTTPS/WSS,并为业务Worker与管理员分别签发所需权限;Worker执行权不自动授予恢复权。
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# 并行生成结果 → 等待外部回执 → 后续任务
|
# 并行生成结果 → 等待外部回执 → 后续任务
|
||||||
|
|
||||||
[完整源码](../../sdk/go/examples/workflow/main.go)通过独立Go SDK发布固定版本、启动实例,并使用真实自动Worker处理任务。流程是两个文本规范化任务并行完成并汇合,等待500毫秒,等待模拟外部确认信号,最后用左侧输出执行发布步骤。输入为 `{"text":" hello orbit "}`,输出为 `{"text":"HELLO ORBIT"}`。
|
[完整源码](../../examples/workflow/main.go)通过独立Go SDK发布固定版本、启动实例,并使用真实自动Worker处理任务。流程是两个文本规范化任务并行完成并汇合,等待500毫秒,等待模拟外部确认信号,最后用左侧输出执行发布步骤。输入为 `{"text":" hello orbit "}`,输出为 `{"text":"HELLO ORBIT"}`。
|
||||||
|
|
||||||
## 1. 启动
|
## 1. 启动
|
||||||
|
|
||||||
@@ -21,10 +21,10 @@ go run ./cmd/orbit
|
|||||||
初始化仅执行一次,文件存在时不会覆盖。重用该凭据运行例子无需重复bootstrap。另开终端,从仓库根目录执行:
|
初始化仅执行一次,文件存在时不会覆盖。重用该凭据运行例子无需重复bootstrap。另开终端,从仓库根目录执行:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cd sdk/go
|
cd examples
|
||||||
ORBIT_URL=http://127.0.0.1:8080 \
|
ORBIT_URL=http://127.0.0.1:8080 \
|
||||||
ORBIT_CREDENTIALS_FILE=../../.local/workflow.credentials.json \
|
ORBIT_CREDENTIALS_FILE=../.local/workflow.credentials.json \
|
||||||
go run ./examples/workflow
|
go run ./workflow
|
||||||
```
|
```
|
||||||
|
|
||||||
生产使用HTTPS/WSS,并为定义发布者、启动者、信号发送者及Worker分别签发所需权限。本示例使用一个专用开发凭据,未申请人工恢复或控制权限。
|
生产使用HTTPS/WSS,并为定义发布者、启动者、信号发送者及Worker分别签发所需权限。本示例使用一个专用开发凭据,未申请人工恢复或控制权限。
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
- 受理、计划生成、领取、Start、取消、Finish、安全重试及到期恢复共同维护应用计数,跨命名空间与队列共享。空轮询与失败受理不消耗计数,重复回执不重复计费。
|
- 受理、计划生成、领取、Start、取消、Finish、安全重试及到期恢复共同维护应用计数,跨命名空间与队列共享。空轮询与失败受理不消耗计数,重复回执不重复计费。
|
||||||
- 额度行与认证身份分离,统一按应用额度 → 队列 → 任务/尝试 → 许可顺序取锁;后台扫描跳过忙碌额度,应用停用后仍可释放到期尝试。
|
- 额度行与认证身份分离,统一按应用额度 → 队列 → 任务/尝试 → 许可顺序取锁;后台扫描跳过忙碌额度,应用停用后仍可释放到期尝试。
|
||||||
- 管理 CLI 支持 `--application-id` 在已有启用应用下增加命名空间;应用管理权限必须显式 `--resource-access`,普通队列及 Worker 凭据不扩权。
|
- 管理 CLI 支持 `--application-id` 在已有启用应用下增加命名空间;应用管理权限必须显式 `--resource-access`,普通队列及 Worker 凭据不扩权。
|
||||||
- [双命名空间 SDK 示例](../../sdk/go/examples/application-resources/main.go):第一侧受理,第二侧 APPLICATION_FULL,第一侧取消释放,第二侧原身份重报成功,取消收尾并按 CAS 恢复配置。
|
- [双命名空间 SDK 示例](../../examples/application-resources/main.go):第一侧受理,第二侧 APPLICATION_FULL,第一侧取消释放,第二侧原身份重报成功,取消收尾并按 CAS 恢复配置。
|
||||||
|
|
||||||
## 2. 环境和实际回归
|
## 2. 环境和实际回归
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
- [服务契约](../../pulse/service/batch.go):最多32项,逐项独立事务与幂等,ACCEPTED/REJECTED/UNKNOWN/NOT_ATTEMPTED四类结果。未知数据库结果或凭据失效后停止余项,上下文结束保留已确认前项。
|
- [服务契约](../../pulse/service/batch.go):最多32项,逐项独立事务与幂等,ACCEPTED/REJECTED/UNKNOWN/NOT_ATTEMPTED四类结果。未知数据库结果或凭据失效后停止余项,上下文结束保留已确认前项。
|
||||||
- [HTTP入口](../../internal/transport/httpserver/tasks.go):`POST /v1/tasks:batch`,全体正文严格解析后才受理,每项正文幂等键,总请求512 KiB。完整响应使用HTTP200,逐项标记结果。
|
- [HTTP入口](../../internal/transport/httpserver/tasks.go):`POST /v1/tasks:batch`,全体正文严格解析后才受理,每项正文幂等键,总请求512 KiB。完整响应使用HTTP200,逐项标记结果。
|
||||||
- [独立SDK](../../sdk/go/batch.go):SubmitTasks及中文字段说明,不自动生成身份、拆批或重试;校验返回数量、顺序、状态与回执归属。
|
- [独立SDK](../../sdk/go/batch.go):SubmitTasks及中文字段说明,不自动生成身份、拆批或重试;校验返回数量、顺序、状态与回执归属。
|
||||||
- [运行示例](../../sdk/go/examples/batch/main.go):两项受理、一项满额,原键核对后释放配额,仅补交被拒项并取消收尾。
|
- [运行示例](../../examples/batch/main.go):两项受理、一项满额,原键核对后释放配额,仅补交被拒项并取消收尾。
|
||||||
- [接口手册](../api/batch-tasks.md)、[场景说明](../examples/batch.md)、[开发计划](../08-development-plan.md) 同步维护。
|
- [接口手册](../api/batch-tasks.md)、[场景说明](../examples/batch.md)、[开发计划](../08-development-plan.md) 同步维护。
|
||||||
|
|
||||||
不增加数据库模型或迁移,平台仍为35个实体、289个中文注释持久化字段;不增加外键、级联或SDK数据库依赖。
|
不增加数据库模型或迁移,平台仍为35个实体、289个中文注释持久化字段;不增加外键、级联或SDK数据库依赖。
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
- 取消后不延长期限、不产生后续重试;有效成功结果仍能确认,普通取消错误或失联保持未知效果。
|
- 取消后不延长期限、不产生后续重试;有效成功结果仍能确认,普通取消错误或失联保持未知效果。
|
||||||
- 明确取消结果使用 task.finish / CANCELLED;本次确认停止不能清除此前未核实的外部效果。
|
- 明确取消结果使用 task.finish / CANCELLED;本次确认停止不能清除此前未核实的外部效果。
|
||||||
- 可选择的 task.cancel 通知、Resume/Start/Renew 中的当前取消意图、独立 SDK 自动停止处理器和有界收尾。
|
- 可选择的 task.cancel 通知、Resume/Start/Renew 中的当前取消意图、独立 SDK 自动停止处理器和有界收尾。
|
||||||
- [完整取消场景](../../sdk/go/examples/cancellation/main.go)、[接口与升级说明](../api/cancellation.md) 已同步交付。
|
- [完整取消场景](../../examples/cancellation/main.go)、[接口与升级说明](../api/cancellation.md) 已同步交付。
|
||||||
- 迁移 000007 扩展取消证据;000008 移除 70 个历史外键,保留索引、唯一约束、CHECK、触发器和数据。实体数仍为 32,没有新增持久化字段。
|
- 迁移 000007 扩展取消证据;000008 移除 70 个历史外键,保留索引、唯一约束、CHECK、触发器和数据。实体数仍为 32,没有新增持久化字段。
|
||||||
- 开发规范明确禁止再引入外键。应用启动/readiness 核验迁移及零外键要求;任务、计划及 Worker 关联由服务端事务校验。
|
- 开发规范明确禁止再引入外键。应用启动/readiness 核验迁移及零外键要求;任务、计划及 Worker 关联由服务端事务校验。
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
- [EventConsumer](../../sdk/go/event_consumer.go):自动心跳、指数退避重连、本地1–32个在途事件、成功后确认、ACK不明时原证明核对、处理器失败不确认、取消与有界收尾。
|
- [EventConsumer](../../sdk/go/event_consumer.go):自动心跳、指数退避重连、本地1–32个在途事件、成功后确认、ACK不明时原证明核对、处理器失败不确认、取消与有界收尾。
|
||||||
- [类型及秘密隐藏](../../sdk/go/event_types.go):ResultEvent不给业务处理器租约秘密;Grant/Proof仍可显式序列化用于受保护的存储,普通fmt隐藏敏感数据。
|
- [类型及秘密隐藏](../../sdk/go/event_types.go):ResultEvent不给业务处理器租约秘密;Grant/Proof仍可显式序列化用于受保护的存储,普通fmt隐藏敏感数据。
|
||||||
- [严格解码](../../sdk/go/event_codec.go):大小写、重复键、方向、会话、规范uint64、证明编码和事件/交付/快照关联。大整数不经float64转换。协议类WebSocket关闭按永久错误处理。
|
- [严格解码](../../sdk/go/event_codec.go):大小写、重复键、方向、会话、规范uint64、证明编码和事件/交付/快照关联。大整数不经float64转换。协议类WebSocket关闭按永久错误处理。
|
||||||
- [协议例子](../../sdk/go/examples/event-protocol/main.go):产生取消结果、读取、ACK、重连重报、验证原确认时间、暂停订阅。它只读取结果,不执行接收方业务写入。
|
- [协议例子](../../examples/event-protocol/main.go):产生取消结果、读取、ACK、重连重报、验证原确认时间、暂停订阅。它只读取结果,不执行接收方业务写入。
|
||||||
- SDK保持独立模块,无新增数据库驱动、服务端包或持久化模型。本阶段不增加迁移、外键或级联删除。
|
- SDK保持独立模块,无新增数据库驱动、服务端包或持久化模型。本阶段不增加迁移、外键或级联删除。
|
||||||
|
|
||||||
## 2. 验证环境与入口
|
## 2. 验证环境与入口
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
- 续租、取消、结果、退避及到期恢复同步维护两类许可。UNKNOWN 释放执行许可并保留核查与未知效果,旧结果不能释放后续尝试的许可。
|
- 续租、取消、结果、退避及到期恢复同步维护两类许可。UNKNOWN 释放执行许可并保留核查与未知效果,旧结果不能释放后续尝试的许可。
|
||||||
- Worker 显式协商 concurrency_keys;旧 Worker 不消费有键任务,自动 SDK 默认开启。协议 Schema、SDK 精确 uint64、尝试历史与计划模板同步支持。
|
- Worker 显式协商 concurrency_keys;旧 Worker 不消费有键任务,自动 SDK 默认开启。协议 Schema、SDK 精确 uint64、尝试历史与计划模板同步支持。
|
||||||
- [000011 迁移](../../internal/storage/mysql/migrations/000011_keyed_concurrency.up.sql) 新增四个中文注释字段,无外键。当前 33 个实体、273 个直接声明的持久化字段均有中文注释,SQL 同步 COMMENT。
|
- [000011 迁移](../../internal/storage/mysql/migrations/000011_keyed_concurrency.up.sql) 新增四个中文注释字段,无外键。当前 33 个实体、273 个直接声明的持久化字段均有中文注释,SQL 同步 COMMENT。
|
||||||
- [完整示例](../../sdk/go/examples/keyed-concurrency/main.go) 创建两个队列、两个 Worker、相同资源键,核对序号并模拟资源端拒绝旧写入。
|
- [完整示例](../../examples/keyed-concurrency/main.go) 创建两个队列、两个 Worker、相同资源键,核对序号并模拟资源端拒绝旧写入。
|
||||||
|
|
||||||
## 2. 环境与命令
|
## 2. 环境与命令
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
- 以最多 270 秒的排序优势实现优先级加速;等待超过此优势的旧任务不被不断到来的最高级新任务持续插队。没有承诺 270 秒内完成或严格 FIFO。
|
- 以最多 270 秒的排序优势实现优先级加速;等待超过此优势的旧任务不被不断到来的最高级新任务持续插队。没有承诺 270 秒内完成或严格 FIFO。
|
||||||
- [节点领取池](../../internal/dispatch/pool.go) 将原来的各连接并发轮询改为应用 → 队列 → 连接请求轮转。总并发 4、单应用在途 1、待处理加在途最多 128;每连接最多一个未完成请求。应用归属由认证后的数据库关系取得,不能按自报应用或不同命名空间分组。
|
- [节点领取池](../../internal/dispatch/pool.go) 将原来的各连接并发轮询改为应用 → 队列 → 连接请求轮转。总并发 4、单应用在途 1、待处理加在途最多 128;每连接最多一个未完成请求。应用归属由认证后的数据库关系取得,不能按自报应用或不同命名空间分组。
|
||||||
- 同命名空间/队列/精确能力的空探测在节点内合并一个周期,缓存最多 128 项;控制收发继续运行。所有任务状态、许可、预算和执行授权仍由数据库事务决定。
|
- 同命名空间/队列/精确能力的空探测在节点内合并一个周期,缓存最多 128 项;控制收发继续运行。所有任务状态、许可、预算和执行授权仍由数据库事务决定。
|
||||||
- [可运行示例](../../sdk/go/examples/priority/main.go)、协议 Schema、接口与 SDK 文档同步更新。当前仍为 33 个实体,274 个直接声明持久化字段全部有中文注释,最终数据库外键为零。
|
- [可运行示例](../../examples/priority/main.go)、协议 Schema、接口与 SDK 文档同步更新。当前仍为 33 个实体,274 个直接声明持久化字段全部有中文注释,最终数据库外键为零。
|
||||||
|
|
||||||
## 2. 环境和执行
|
## 2. 环境和执行
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
- 计划补跑受相同积压上限限制,保留未受理的原触发点;释放空间后按冻结漏跑策略接续。
|
- 计划补跑受相同积压上限限制,保留未受理的原触发点;释放空间后按冻结漏跑策略接续。
|
||||||
- 迁移 000009 增加四个队列字段并回填既有未终结任务,Go/SQL 均有中文说明,无数据库外键。
|
- 迁移 000009 增加四个队列字段并回填既有未终结任务,Go/SQL 均有中文说明,无数据库外键。
|
||||||
- 源码核对 257 个直接声明的持久化字段均有中文注释;实体仍为 32 个。
|
- 源码核对 257 个直接声明的持久化字段均有中文注释;实体仍为 32 个。
|
||||||
- [队列接口与完整 SDK 场景](../api/queues.md)、[resources 示例](../../sdk/go/examples/resources/main.go) 同步交付。
|
- [队列接口与完整 SDK 场景](../api/queues.md)、[resources 示例](../../examples/resources/main.go) 同步交付。
|
||||||
|
|
||||||
## 2. 环境及执行结果
|
## 2. 环境及执行结果
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
- 每节点 128 条事件连接;异步领取池 4 个全局在途、同应用 1 个在途、等待加在途总量 128,按认证应用及订阅轮转。控制收发不被同连接的慢领取阻塞。连接容量仍由持久化租约校验。
|
- 每节点 128 条事件连接;异步领取池 4 个全局在途、同应用 1 个在途、等待加在途总量 128,按认证应用及订阅轮转。控制收发不被同连接的慢领取阻塞。连接容量仍由持久化租约校验。
|
||||||
- [严格解码](../../internal/transport/httpserver/event_codec.go) 与 [公开 Schema](../../protocol/eventsv1/events.schema.json):方向、必填、字段精确大小写、规范 uint64、证明格式和消息大小;JSON 重复键、伪造响应字段或错误会话被拒绝。
|
- [严格解码](../../internal/transport/httpserver/event_codec.go) 与 [公开 Schema](../../protocol/eventsv1/events.schema.json):方向、必填、字段精确大小写、规范 uint64、证明格式和消息大小;JSON 重复键、伪造响应字段或错误会话被拒绝。
|
||||||
- [管理 SDK](../../sdk/go/subscriptions.go) 与 [独立 DTO](../../sdk/go/subscription_types.go):七个管理/查询方法及类型,保留大整数和显式布尔控制,不依赖服务端或数据库包。
|
- [管理 SDK](../../sdk/go/subscriptions.go) 与 [独立 DTO](../../sdk/go/subscription_types.go):七个管理/查询方法及类型,保留大整数和显式布尔控制,不依赖服务端或数据库包。
|
||||||
- [完整管理例子](../../sdk/go/examples/subscriptions/main.go) 已纳入统一隔离环境脚本。原始 WSS 测试辅助代码不作为正式消费 SDK 对外提供。
|
- [完整管理例子](../../examples/subscriptions/main.go) 已纳入统一隔离环境脚本。原始 WSS 测试辅助代码不作为正式消费 SDK 对外提供。
|
||||||
|
|
||||||
## 2. 验证环境与结果
|
## 2. 验证环境与结果
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
- 抖动退避写入数据库 available_at;与尝试结果、许可释放、事件、结果审计及操作回执原子提交。后台回收保留含节点身份与决策的事件。
|
- 抖动退避写入数据库 available_at;与尝试结果、许可释放、事件、结果审计及操作回执原子提交。后台回收保留含节点身份与决策的事件。
|
||||||
- 结果换消息身份重报也取原已应用回执;过滤早到的证据回执,避免借用后续尝试状态。
|
- 结果换消息身份重报也取原已应用回执;过滤早到的证据回执,避免借用后续尝试状态。
|
||||||
- 前向迁移 000005 增加三个中文注释字段和结果回执索引;实体仍为 32 个,旧迁移未改动。
|
- 前向迁移 000005 增加三个中文注释字段和结果回执索引;实体仍为 32 个,旧迁移未改动。
|
||||||
- 同步独立 SDK、Worker Schema、查询字段、[接口手册](../api/retries.md) 与 [完整示例](../../sdk/go/examples/retry/main.go)。
|
- 同步独立 SDK、Worker Schema、查询字段、[接口手册](../api/retries.md) 与 [完整示例](../../examples/retry/main.go)。
|
||||||
|
|
||||||
## 2. 环境与执行命令
|
## 2. 环境与执行命令
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
- SKIP / COALESCE / CATCH_UP 漏跑策略与 PARALLEL / SERIAL / SKIP 重叠策略;明确补偿窗口、延迟容差、批量和扫描间隔。
|
- SKIP / COALESCE / CATCH_UP 漏跑策略与 PARALLEL / SERIAL / SKIP 重叠策略;明确补偿窗口、延迟容差、批量和扫描间隔。
|
||||||
- 发布新版本保留旧生效边界前的积压;跳过和合并范围不越过版本边界。已产生任务保留当时模板。
|
- 发布新版本保留旧生效边界前的积压;跳过和合并范围不越过版本边界。已产生任务保留当时模板。
|
||||||
- 多节点用数据库锁与唯一触发身份竞争;触发决定、对应任务、事件及进度一起提交。
|
- 多节点用数据库锁与唯一触发身份竞争;触发决定、对应任务、事件及进度一起提交。
|
||||||
- 实际 orbit 命令持续扫描,独立 SDK 与 [完整周期快照示例](../../sdk/go/examples/schedules/main.go) 同步交付。
|
- 实际 orbit 命令持续扫描,独立 SDK 与 [完整周期快照示例](../../examples/schedules/main.go) 同步交付。
|
||||||
- 迁移 000006 增加运行字段与索引,实体仍为 32 个;新模型字段及 SQL COMMENT 均为中文;源码核对 32 个持久化模型、253 个直接声明的持久化字段均有中文说明。
|
- 迁移 000006 增加运行字段与索引,实体仍为 32 个;新模型字段及 SQL COMMENT 均为中文;源码核对 32 个持久化模型、253 个直接声明的持久化字段均有中文说明。
|
||||||
|
|
||||||
完整字段、权限、状态与示例见 [接口手册](../api/schedules.md)。
|
完整字段、权限、状态与示例见 [接口手册](../api/schedules.md)。
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
- [查询存储](../../internal/storage/mysql/task_query.go):固定四种索引分支、参数化SQL、创建时间/ID游标分页,v2摘要绑定全部筛选,旧游标只兼容原队列/状态查询。
|
- [查询存储](../../internal/storage/mysql/task_query.go):固定四种索引分支、参数化SQL、创建时间/ID游标分页,v2摘要绑定全部筛选,旧游标只兼容原队列/状态查询。
|
||||||
- [HTTP入口](../../internal/transport/httpserver/tasks.go)与[独立SDK](../../sdk/go/task_query.go):URL编码、UTC规范化、显式空参数与未知参数拒绝,SDK无数据库依赖。
|
- [HTTP入口](../../internal/transport/httpserver/tasks.go)与[独立SDK](../../sdk/go/task_query.go):URL编码、UTC规范化、显式空参数与未知参数拒绝,SDK无数据库依赖。
|
||||||
- [迁移000016](../../internal/storage/mysql/migrations/000016_task_query_filters.up.sql):business_key使用精确NO PAD二进制排序,增加两种队列业务键索引,中文字段含义同步。无新增模型字段、无外键/级联,仍为35个模型、289个持久化字段。
|
- [迁移000016](../../internal/storage/mysql/migrations/000016_task_query_filters.up.sql):business_key使用精确NO PAD二进制排序,增加两种队列业务键索引,中文字段含义同步。无新增模型字段、无外键/级联,仍为35个模型、289个持久化字段。
|
||||||
- [接口手册](../api/task-queries.md)、[完整示例说明](../examples/task-query.md)及[源码](../../sdk/go/examples/task-query/main.go)。
|
- [接口手册](../api/task-queries.md)、[完整示例说明](../examples/task-query.md)及[源码](../../examples/task-query/main.go)。
|
||||||
|
|
||||||
## 2. 真实数据库验证
|
## 2. 真实数据库验证
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
- [服务契约](../../pulse/service/recovery.go):显式历史执行结束/安全重试声明、原因、证据、版本及预算校验。
|
- [服务契约](../../pulse/service/recovery.go):显式历史执行结束/安全重试声明、原因、证据、版本及预算校验。
|
||||||
- [数据库事务](../../internal/storage/mysql/task_recovery.go):NEEDS_REVIEW核查为SUCCEEDED/FAILED,原尝试保留;独立FAILED/CANCELLED任务生成retry_of关联后继,原任务不改写。
|
- [数据库事务](../../internal/storage/mysql/task_recovery.go):NEEDS_REVIEW核查为SUCCEEDED/FAILED,原尝试保留;独立FAILED/CANCELLED任务生成retry_of关联后继,原任务不改写。
|
||||||
- [审计查询](../../internal/storage/mysql/task_operations.go):专门权限与父资源范围,摘要游标分页、详情原因和证据,真实凭据身份。
|
- [审计查询](../../internal/storage/mysql/task_operations.go):专门权限与父资源范围,摘要游标分页、详情原因和证据,真实凭据身份。
|
||||||
- [Go SDK](../../sdk/go/recovery.go)、[接口手册](../api/task-recovery.md)、[完整运行场景](../examples/recovery.md)及[源码](../../sdk/go/examples/recovery/main.go)。
|
- [Go SDK](../../sdk/go/recovery.go)、[接口手册](../api/task-recovery.md)、[完整运行场景](../examples/recovery.md)及[源码](../../examples/recovery/main.go)。
|
||||||
- [迁移000015](../../internal/storage/mysql/migrations/000015_task_manual_recovery.up.sql):现有RetryOf字段中文语义、同父后继唯一索引与禁止自身关联CHECK。35个模型、289个持久化字段,无新增字段,无外键/级联。
|
- [迁移000015](../../internal/storage/mysql/migrations/000015_task_manual_recovery.up.sql):现有RetryOf字段中文语义、同父后继唯一索引与禁止自身关联CHECK。35个模型、289个持久化字段,无新增字段,无外键/级联。
|
||||||
|
|
||||||
## 2. 已覆盖的数据库与协议场景
|
## 2. 已覆盖的数据库与协议场景
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
- [服务模型](../../pulse/service/source.go)与[存储查询](../../internal/storage/mysql/task_source.go):DIRECT、MANUAL_RETRY、SCHEDULE三类来源;计划ID、触发记录、冻结版本及合并范围;人工重试仅一跳父任务。
|
- [服务模型](../../pulse/service/source.go)与[存储查询](../../internal/storage/mysql/task_source.go):DIRECT、MANUAL_RETRY、SCHEDULE三类来源;计划ID、触发记录、冻结版本及合并范围;人工重试仅一跳父任务。
|
||||||
- [HTTP路由](../../internal/transport/httpserver/history.go)提供GET /v1/tasks/{task_id}/source,沿用tasks:read和队列范围,拒绝查询参数。
|
- [HTTP路由](../../internal/transport/httpserver/history.go)提供GET /v1/tasks/{task_id}/source,沿用tasks:read和队列范围,拒绝查询参数。
|
||||||
- [独立SDK](../../sdk/go/task_source.go)验证响应ID、类型组合、版本和时间,保留uint64精度;没有数据库依赖或自动重试。
|
- [独立SDK](../../sdk/go/task_source.go)验证响应ID、类型组合、版本和时间,保留uint64精度;没有数据库依赖或自动重试。
|
||||||
- [接口手册](../api/task-source.md)、[普通提交](../../sdk/go/examples/tasks/main.go)、[计划](../../sdk/go/examples/schedules/main.go)及[人工恢复](../../sdk/go/examples/recovery/main.go)同步提供调用与输出。
|
- [接口手册](../api/task-source.md)、[普通提交](../../examples/tasks/main.go)、[计划](../../examples/schedules/main.go)及[人工恢复](../../examples/recovery/main.go)同步提供调用与输出。
|
||||||
|
|
||||||
来源独立读取,不改变Task/TaskSummary及Worker协议,不在派发路径增加关联查询。复用现有(namespace_id,task_id)触发唯一索引及计划版本键,不新增迁移、索引或持久化字段;平台仍为35个实体、289个中文注释字段。新只读结构的字段也均有中文说明。
|
来源独立读取,不改变Task/TaskSummary及Worker协议,不在派发路径增加关联查询。复用现有(namespace_id,task_id)触发唯一索引及计划版本键,不新增迁移、索引或持久化字段;平台仍为35个实体、289个中文注释字段。新只读结构的字段也均有中文说明。
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
| 立即、相对延迟、指定时间提交 | 立即受理、数据库时间计算delay_ms、绝对available_at;[HTTP事务用例](../../internal/storage/mysql/task_integration_test.go)核对同键并发、相对时长、非法组合与批量;[SDK真实执行](../../sdk/go/task_delay_integration_test.go)核对数据库创建/开始时间不早于保存的执行时间 |
|
| 立即、相对延迟、指定时间提交 | 立即受理、数据库时间计算delay_ms、绝对available_at;[HTTP事务用例](../../internal/storage/mysql/task_integration_test.go)核对同键并发、相对时长、非法组合与批量;[SDK真实执行](../../sdk/go/task_delay_integration_test.go)核对数据库创建/开始时间不早于保存的执行时间 |
|
||||||
| 批量受理、逐项恢复 | 最多32项/512 KiB,单项事务和身份复用,区分明确失败/未知/未尝试;[批量报告](phase-3-batch-tasks.md)记录部分已提交后的真实HTTP回执丢失及原键补交 |
|
| 批量受理、逐项恢复 | 最多32项/512 KiB,单项事务和身份复用,区分明确失败/未知/未尝试;[批量报告](phase-3-batch-tasks.md)记录部分已提交后的真实HTTP回执丢失及原键补交 |
|
||||||
| 幂等及不可变参数/策略 | 任务、身份回执、事件与审计同事务;同语义原回执、变更冲突;[任务用例](../../internal/storage/mysql/task_integration_test.go)核对16并发只创建一次和精确数字;新增可选字段的[旧摘要兼容](../../internal/storage/mysql/task_delay_test.go) |
|
| 幂等及不可变参数/策略 | 任务、身份回执、事件与审计同事务;同语义原回执、变更冲突;[任务用例](../../internal/storage/mysql/task_integration_test.go)核对16并发只创建一次和精确数字;新增可选字段的[旧摘要兼容](../../internal/storage/mysql/task_delay_test.go) |
|
||||||
| 改参数形成关联新任务 | 新提交身份和相同business_key,旧输入保持;[查询示例](../../sdk/go/examples/task-query/main.go)分别读取text/json任务核对输入。该关联不等于业务去重或retry_of,原任务需调用方决定如何处理 |
|
| 改参数形成关联新任务 | 新提交身份和相同business_key,旧输入保持;[查询示例](../../examples/task-query/main.go)分别读取text/json任务核对输入。该关联不等于业务去重或retry_of,原任务需调用方决定如何处理 |
|
||||||
| 单次/总时限、最晚开始、安全重试 | 冻结策略、有限退避及未知效果;[决策](../../pulse/retry/decision_test.go)、[真实事务](../../internal/storage/mysql/worker_retry_integration_test.go)核对预算/回滚/迟到;[全停恢复](phase-3-delay-recovery.md)保留退避、次数和截止,过期不补发 |
|
| 单次/总时限、最晚开始、安全重试 | 冻结策略、有限退避及未知效果;[决策](../../pulse/retry/decision_test.go)、[真实事务](../../internal/storage/mysql/worker_retry_integration_test.go)核对预算/回滚/迟到;[全停恢复](phase-3-delay-recovery.md)保留退避、次数和截止,过期不补发 |
|
||||||
| 等待/运行取消 | 持久化意图、预占阻止开始、运行收集结果、未知效果仍核查;[取消事务](../../internal/storage/mysql/worker_cancel_integration_test.go)验证开始竞争/回滚,[取消报告](phase-3-cancellation.md)包含自动SDK通知、丢通知及不协作处理器 |
|
| 等待/运行取消 | 持久化意图、预占阻止开始、运行收集结果、未知效果仍核查;[取消事务](../../internal/storage/mysql/worker_cancel_integration_test.go)验证开始竞争/回滚,[取消报告](phase-3-cancellation.md)包含自动SDK通知、丢通知及不协作处理器 |
|
||||||
| 人工核查与重试 | 专门权限、版本、原因/证据、安全声明;核查不改旧尝试,人工重试创建唯一直接后继;[恢复用例](../../internal/storage/mysql/task_recovery_integration_test.go)验证竞争、审计失败回滚、原输入/结果保留及管理所有权;[接口/故障报告](phase-3-task-recovery.md) |
|
| 人工核查与重试 | 专门权限、版本、原因/证据、安全声明;核查不改旧尝试,人工重试创建唯一直接后继;[恢复用例](../../internal/storage/mysql/task_recovery_integration_test.go)验证竞争、审计失败回滚、原输入/结果保留及管理所有权;[接口/故障报告](phase-3-task-recovery.md) |
|
||||||
|
|||||||
@@ -35,7 +35,7 @@
|
|||||||
3. 已知失败步骤与并行信号等待 → RearmWorkflowWait第二代,原截止不变 → 旧代次信号被拒绝 → RetryWorkflowStep只保留一次剩余尝试 → 解除核查 → 新任务和新代次信号完成流程。
|
3. 已知失败步骤与并行信号等待 → RearmWorkflowWait第二代,原截止不变 → 旧代次信号被拒绝 → RetryWorkflowStep只保留一次剩余尝试 → 解除核查 → 新任务和新代次信号完成流程。
|
||||||
4. 查询UNKNOWN → 核查为SUCCEEDED/PENDING → 原结果消费 → ContinueWorkflowPoll → ContinueWorkflow → 只创建第二业务轮并最终DONE;查询总截止不变。
|
4. 查询UNKNOWN → 核查为SUCCEEDED/PENDING → 原结果消费 → ContinueWorkflowPoll → ContinueWorkflow → 只创建第二业务轮并最终DONE;查询总截止不变。
|
||||||
|
|
||||||
实现和证据:[公共路由](../../internal/transport/httpserver/workflows.go)、[严格JSON测试](../../internal/transport/httpserver/workflows_test.go)、[初始化范围测试](../../internal/storage/mysql/workflow_bootstrap_integration_test.go)、[当前详情及审计范围测试](../../internal/storage/mysql/workflow_details_integration_test.go)、[独立SDK场景](../../sdk/go/workflow_instances_integration_test.go)、[示例源码](../../sdk/go/examples/workflow/main.go)。完整复现入口是[隔离MySQL脚本](../../scripts/test-mysql.sh),跳过的环境依赖测试不算通过。
|
实现和证据:[公共路由](../../internal/transport/httpserver/workflows.go)、[严格JSON测试](../../internal/transport/httpserver/workflows_test.go)、[初始化范围测试](../../internal/storage/mysql/workflow_bootstrap_integration_test.go)、[当前详情及审计范围测试](../../internal/storage/mysql/workflow_details_integration_test.go)、[独立SDK场景](../../sdk/go/workflow_instances_integration_test.go)、[示例源码](../../examples/workflow/main.go)。完整复现入口是[隔离MySQL脚本](../../scripts/test-mysql.sh),跳过的环境依赖测试不算通过。
|
||||||
|
|
||||||
## 剩余交付
|
## 剩余交付
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
- 000024只新增派生范围表、不可更新触发器及7个复合索引;回填遍历DSL步骤块,保留原版本/实例。最终表结构外键为0,无级联。当前36个模型、311个直接持久化字段有中文注释。
|
- 000024只新增派生范围表、不可更新触发器及7个复合索引;回填遍历DSL步骤块,保留原版本/实例。最终表结构外键为0,无级联。当前36个模型、311个直接持久化字段有中文注释。
|
||||||
- HTTP严格解析参数;SDK与服务端保持独立module。独立示例发布等待流程、验证精确分页、取消结清,不需Worker,也不模拟业务成功。
|
- HTTP严格解析参数;SDK与服务端保持独立module。独立示例发布等待流程、验证精确分页、取消结清,不需Worker,也不模拟业务成功。
|
||||||
|
|
||||||
接口:[查询手册](../api/workflow-queries.md)。示例:[运行说明](../examples/workflow-query.md)及[源码](../../sdk/go/examples/workflow-query/main.go)。
|
接口:[查询手册](../api/workflow-queries.md)。示例:[运行说明](../examples/workflow-query.md)及[源码](../../examples/workflow-query/main.go)。
|
||||||
|
|
||||||
## 环境与命令
|
## 环境与命令
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
专项验证固定版本发布后不变、仅有单队列tasks:read也能查当前任务来源、读取完整流程/定义仍拒绝、跨命名空间/队列拒绝;逐项注入错误所有者、门控、处理器版本、激活所属流程/步骤、任务反向引用、步骤类型、固定版本及策略错误;测试同时出现TASK/POLL关联、POLL父任务错误轮次及所有者丢失。真实恢复链验证业务第1轮→恢复第1轮→第2轮→再次恢复第2轮,激活与业务轮分别计数,原历史可读。
|
专项验证固定版本发布后不变、仅有单队列tasks:read也能查当前任务来源、读取完整流程/定义仍拒绝、跨命名空间/队列拒绝;逐项注入错误所有者、门控、处理器版本、激活所属流程/步骤、任务反向引用、步骤类型、固定版本及策略错误;测试同时出现TASK/POLL关联、POLL父任务错误轮次及所有者丢失。真实恢复链验证业务第1轮→恢复第1轮→第2轮→再次恢复第2轮,激活与业务轮分别计数,原历史可读。
|
||||||
|
|
||||||
源码:[来源存储](../../internal/storage/mysql/task_workflow_source.go)、[关联损坏及权限测试](../../internal/storage/mysql/task_workflow_source_integration_test.go)、[TASK恢复](../../internal/storage/mysql/workflow_recovery_integration_test.go)、[POLL恢复](../../internal/storage/mysql/workflow_poll_recovery_integration_test.go)、[SDK协议验证](../../sdk/go/task_source_test.go)、[真实SDK链路](../../sdk/go/workflow_instances_integration_test.go)、[运行例子](../../sdk/go/examples/workflow/main.go)。完整复现入口:`make integration`,见[隔离脚本](../../scripts/test-mysql.sh)。
|
源码:[来源存储](../../internal/storage/mysql/task_workflow_source.go)、[关联损坏及权限测试](../../internal/storage/mysql/task_workflow_source_integration_test.go)、[TASK恢复](../../internal/storage/mysql/workflow_recovery_integration_test.go)、[POLL恢复](../../internal/storage/mysql/workflow_poll_recovery_integration_test.go)、[SDK协议验证](../../sdk/go/task_source_test.go)、[真实SDK链路](../../sdk/go/workflow_instances_integration_test.go)、[运行例子](../../examples/workflow/main.go)。完整复现入口:`make integration`,见[隔离脚本](../../scripts/test-mysql.sh)。
|
||||||
|
|
||||||
## 继续交付
|
## 继续交付
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
## 实现内容
|
## 实现内容
|
||||||
|
|
||||||
- 新增 [`sdk/go/examples/file-conversion`](../../sdk/go/examples/file-conversion/main.go):提交两行 CSV 快照,由版本化 `file.convert.csv-json` Worker 转成 JSON 结果。
|
- 新增 [`examples/file-conversion`](../../examples/file-conversion/main.go):提交两行 CSV 快照,由版本化 `file.convert.csv-json` Worker 转成 JSON 结果。
|
||||||
- 处理器只读取任务输入和执行上下文,使用稳定提交键;同一个运行身份重复提交不创建第二个任务。
|
- 处理器只读取任务输入和执行上下文,使用稳定提交键;同一个运行身份重复提交不创建第二个任务。
|
||||||
- 结果包含输出文件名、格式、转换正文和行数;输入标题重复、行列数不匹配或格式不支持时返回固定 `INVALID_FILE`,不把原始异常正文写入结果。
|
- 结果包含输出文件名、格式、转换正文和行数;输入标题重复、行列数不匹配或格式不支持时返回固定 `INVALID_FILE`,不把原始异常正文写入结果。
|
||||||
- 示例结束前等待 Worker 排空,任务与审计历史保留;单元测试覆盖正常 CSV、重复标题和列数错误。
|
- 示例结束前等待 Worker 排空,任务与审计历史保留;单元测试覆盖正常 CSV、重复标题和列数错误。
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ ORBIT_COMPAT_OLD_COMMIT=a50d5fa ./scripts/test-historical-sdk-compatibility.sh
|
|||||||
make mysql-compatibility
|
make mysql-compatibility
|
||||||
```
|
```
|
||||||
|
|
||||||
脚本使用 Go 1.27.1 容器构建历史与当前的 `orbit`、`orbit-migrate`、`orbit-admin`,使用一次性 MySQL 8.4 数据库分别初始化两套 schema,再启动真实 HTTP 服务运行 `sdk/go/examples/tasks`。任务提交、重复幂等、查询、分页和取消都通过真实服务完成;数据库、容器、临时凭据和二进制在退出时清理。
|
脚本使用 Go 1.27.1 容器构建历史与当前的 `orbit`、`orbit-migrate`、`orbit-admin`,使用一次性 MySQL 8.4 数据库分别初始化两套 schema,再启动真实 HTTP 服务运行 `examples/tasks`。任务提交、重复幂等、查询、分页和取消都通过真实服务完成;数据库、容器、临时凭据和二进制在退出时清理。
|
||||||
|
|
||||||
## 实际结果
|
## 实际结果
|
||||||
|
|
||||||
|
|||||||
34
docs/reports/v0.1.1-release.md
Normal file
34
docs/reports/v0.1.1-release.md
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
# v0.1.1:统一示例与正式版本发布
|
||||||
|
|
||||||
|
日期:2026-09-24。目标:以 `main` 交付代码,使用固定版本安装 SDK/Outbox,将功能说明和接入入口集中到根 README。
|
||||||
|
|
||||||
|
## 内容
|
||||||
|
|
||||||
|
- 24 个轻量 SDK 示例迁至根 examples module;与原有三个业务数据库工程一起形成 27 个独立场景目录。
|
||||||
|
- 每个目录补充 README,根 README 列出功能、准备条件、初始化管理员、调用方式、预期结果、配置及运维入口。
|
||||||
|
- 工作区、7 个模块的构建回归、MySQL/控制台/历史兼容脚本同步调整路径;历史版本 checkout 仍使用其原目录。
|
||||||
|
- 公共 SDK 生产代码没有改动;公共 MySQL Outbox 核心沿用[已经验收的实现](outbox-http-integration.md)。数据库结构没有因本次目录整理变化。
|
||||||
|
|
||||||
|
## 本次验证
|
||||||
|
|
||||||
|
发布前检查结果如下;远端安装结果在发布后回写 main 的本记录:
|
||||||
|
|
||||||
|
| 检查 | 结果 |
|
||||||
|
| --- | --- |
|
||||||
|
| 7 模块 `make test vet build` | 通过,退出 0 |
|
||||||
|
| `make sdk-check protocol-check docs-check` | 通过;SDK 5 个包、禁止依赖为 0;193 份 Markdown 本地链接有效 |
|
||||||
|
| `make integration` | 通过,退出 0;真实 MySQL、27 个示例场景、事务/HTTP 回执丢失、进程强杀及多节点恢复 |
|
||||||
|
| `make console-e2e` | 通过;登录/保护路由、Worker/重试/计划、保留策略/周期归档作业、离线核验和退出登录 |
|
||||||
|
| 历史任务 API 双向 smoke | 通过;当前 SDK 对 a50d5fa 服务端、a50d5fa SDK 对当前服务端 |
|
||||||
|
| 远端 main 与三组标签 | 待发布 |
|
||||||
|
| 仓库外固定版本安装、构建、HTTP smoke 与校验和 | 待发布后验证 |
|
||||||
|
|
||||||
|
## 版本约定
|
||||||
|
|
||||||
|
服务端 `v0.1.1`、SDK `sdk/go/v0.1.1`、Outbox `adapters/outbox/mysql/v0.1.1` 对齐同一个发布提交。既有 v0.1.0 标签保留,不强推或覆盖。
|
||||||
|
|
||||||
|
轻量示例及适配包 go.mod 保留 SDK 最低兼容依赖 v0.1.0;在仓库中通过 go.work 测试本地 SDK,在 GOWORK=off 下验证已发布最低依赖。业务安装当前 v0.1.1,不依赖本地 replace。三个业务示例中的 replace 只用于仓库内开发联调。
|
||||||
|
|
||||||
|
## 边界
|
||||||
|
|
||||||
|
上述检查验证示例迁移、当前平台链路和远端发布,不等同于目标生产容量或跨故障域验收。历史 API smoke 不冒充全协议跨标签矩阵,具体矩阵见[兼容说明](../sdk/compatibility.md)。归档继续保留源数据,不承诺源数据删除或其他数据库适配。
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
# Go SDK 接入说明
|
# Go SDK 接入说明
|
||||||
|
|
||||||
已实现健康查询、任务单项与[批量提交](../api/batch-tasks.md)/查询/分页/待执行取消、队列创建/查询、[自动 Worker](worker-runtime.md)、[Worker 底层协议 SDK](worker.md) 和 [执行历史查询](../api/execution-history.md)。[人工核查与重试](../api/task-recovery.md) 已提供 ReviewTask、RetryTask 与任务操作审计查询。[安全重试](../api/retries.md) 已提供有限策略、WorkerFailure.Retryable、历史查询及完整例子。[计划调度](../api/schedules.md) 已支持创建、查询、版本发布、暂停/恢复、触发历史与完整示例。[订阅管理](../api/subscriptions.md) 已支持创建、查询、暂停恢复、交付历史与人工重试;[事件消费 SDK](event-consumer.md) 已支持连接、自动心跳、重连与确认。[流程定义发布](../api/workflow-definitions.md)、[实例/控制/信号/操作审计](../api/workflows.md)及[六类人工恢复](../api/workflow-recovery.md)已提供独立SDK;完整历史与更多场景按[开发计划](../08-development-plan.md)继续实现。
|
已实现健康查询、任务单项与[批量提交](../api/batch-tasks.md)/查询/分页/待执行取消、队列创建/查询、[自动 Worker](worker-runtime.md)、[Worker 底层协议 SDK](worker.md) 和 [执行历史查询](../api/execution-history.md)。[人工核查与重试](../api/task-recovery.md) 已提供 ReviewTask、RetryTask 与任务操作审计查询。[安全重试](../api/retries.md) 已提供有限策略、WorkerFailure.Retryable、历史查询及完整例子。[计划调度](../api/schedules.md) 已支持创建、查询、版本发布、暂停/恢复、触发历史与完整示例。[订阅管理](../api/subscriptions.md) 已支持创建、查询、暂停恢复、交付历史与人工重试;[事件消费 SDK](event-consumer.md) 已支持连接、自动心跳、重连与确认。[流程定义发布](../api/workflow-definitions.md)、[实例/控制/信号/操作审计](../api/workflows.md)及[六类人工恢复](../api/workflow-recovery.md)已提供独立SDK;历史、查询、轮询与恢复均有[可运行示例](../../examples/README.md)。
|
||||||
|
|
||||||
生产接入推荐按[生产接入闭环](production-integration.md)执行:业务 Outbox 持久化幂等身份,SDK 负责 HTTP 受理和查询,Event WebSocket 负责可靠通知,业务 Inbox 负责去重和确认;网络结果不明时始终保留原键核对。
|
生产接入推荐按[生产接入闭环](production-integration.md)执行:业务 Outbox 持久化幂等身份,SDK 负责 HTTP 受理和查询,Event WebSocket 负责可靠通知,业务 Inbox 负责去重和确认;网络结果不明时始终保留原键核对。
|
||||||
|
|
||||||
@@ -29,11 +29,11 @@ go run ./cmd/orbit
|
|||||||
另开终端,从仓库根目录执行:
|
另开终端,从仓库根目录执行:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cd sdk/go
|
cd examples
|
||||||
ORBIT_URL=http://127.0.0.1:8080 go run ./examples/health
|
ORBIT_URL=http://127.0.0.1:8080 go run ./health
|
||||||
ORBIT_URL=http://127.0.0.1:8080 \
|
ORBIT_URL=http://127.0.0.1:8080 \
|
||||||
ORBIT_CREDENTIALS_FILE=../../.local/development.credentials.json \
|
ORBIT_CREDENTIALS_FILE=../.local/development.credentials.json \
|
||||||
go run ./examples/tasks
|
go run ./tasks
|
||||||
```
|
```
|
||||||
|
|
||||||
预期输出,task 为每次运行生成的实际 ID:
|
预期输出,task 为每次运行生成的实际 ID:
|
||||||
@@ -46,8 +46,8 @@ task=<32位任务ID> duplicate=true listed=1 final_state=CANCELLED revision=2
|
|||||||
|
|
||||||
重复运行示例会新建一个独立任务并取消它,listed 数量可能增加,最多显示当前页 10 条。数据和审计保留,不执行硬删除。任务受理示例不启动 Worker;真实文件转换见[CSV→JSON场景](../examples/file-conversion.md)。
|
重复运行示例会新建一个独立任务并取消它,listed 数量可能增加,最多显示当前页 10 条。数据和审计保留,不执行硬删除。任务受理示例不启动 Worker;真实文件转换见[CSV→JSON场景](../examples/file-conversion.md)。
|
||||||
|
|
||||||
- [健康示例源码](../../sdk/go/examples/health/main.go):只读,无业务资源写入。
|
- [健康示例源码](../../examples/health/main.go):只读,无业务资源写入。
|
||||||
- [任务示例源码](../../sdk/go/examples/tasks/main.go):提交两次同一身份、获取当前状态、列表、带版本取消,再核对直接来源。
|
- [任务示例源码](../../examples/tasks/main.go):提交两次同一身份、获取当前状态、列表、带版本取消,再核对直接来源。
|
||||||
- 任务示例也接受 ORBIT_TOKEN 和 ORBIT_QUEUE_ID,环境值优先于凭据文件。
|
- 任务示例也接受 ORBIT_TOKEN 和 ORBIT_QUEUE_ID,环境值优先于凭据文件。
|
||||||
- 示例发生错误会打印错误并非零退出;打印内容不包含原始 token。
|
- 示例发生错误会打印错误并非零退出;打印内容不包含原始 token。
|
||||||
- 初始凭据 30 天有效。初始化行为和错误核对方式见 [凭据文档](../api/authentication.md)。
|
- 初始凭据 30 天有效。初始化行为和错误核对方式见 [凭据文档](../api/authentication.md)。
|
||||||
@@ -148,10 +148,10 @@ Options.HTTPClient 可注入专用 HTTP 客户端。SDK 复制配置,不修改
|
|||||||
|
|
||||||
## 5. 外部项目通过远端接入
|
## 5. 外部项目通过远端接入
|
||||||
|
|
||||||
业务项目需要 Go 1.27.1 或更高版本。在业务项目的 `go.mod` 所在目录安装首个接入版本:
|
业务项目需要 Go 1.27.1 或更高版本。在业务项目的 `go.mod` 所在目录安装当前接入版本:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
go get git.yuntuo.hk/k2safe/orbit/sdk/go@v0.1.0
|
go get git.yuntuo.hk/k2safe/orbit/sdk/go@v0.1.1
|
||||||
```
|
```
|
||||||
|
|
||||||
代码中导入:
|
代码中导入:
|
||||||
@@ -167,9 +167,9 @@ go mod tidy
|
|||||||
go mod verify
|
go mod verify
|
||||||
```
|
```
|
||||||
|
|
||||||
SDK 位于仓库子目录,对应 Git 标签为 `sdk/go/v0.1.0`;`go get` 使用模块版本 `v0.1.0`。服务端对应仓库标签为 `v0.1.0`。业务项目固定版本并提交 `go.mod` 与 `go.sum`,无需本地源码、`replace` 或 Orbit 的 `go.work`。如果此前配置过本地替换,先执行 `go mod edit -dropreplace=git.yuntuo.hk/k2safe/orbit/sdk/go`。
|
SDK 位于仓库子目录,对应 Git 标签为 `sdk/go/v0.1.1`;`go get` 使用模块版本 `v0.1.1`。服务端对应仓库标签为 `v0.1.1`。业务项目固定版本并提交 `go.mod` 与 `go.sum`,无需本地源码、`replace` 或 Orbit 的 `go.work`。如果此前配置过本地替换,先执行 `go mod edit -dropreplace=git.yuntuo.hk/k2safe/orbit/sdk/go`。
|
||||||
|
|
||||||
这是开发与测试接入版本;生产部署仍按[交付清单](../release-checklist.md)完成目标环境验收。版本发布和校验规则见[发布说明](release.md),空缓存远端取包结果见[验证报告](../reports/phase-7-sdk-remote-release.md)。
|
这是开发与测试接入版本;生产部署仍按[交付清单](../release-checklist.md)完成目标环境验收。版本发布和校验规则见[发布说明](release.md),空缓存远端取包结果见[验证报告](../reports/v0.1.1-release.md)。
|
||||||
|
|
||||||
## 6. 查询执行历史与证据
|
## 6. 查询执行历史与证据
|
||||||
|
|
||||||
@@ -193,13 +193,13 @@ for {
|
|||||||
|
|
||||||
查询证据对应 `ListAttemptEvidence(ctx, taskID, attemptID, pageRequest)` 与 `GetAttemptEvidence(ctx, taskID, attemptID, evidenceID)`,列表相同方式使用 NextCursor。结果正文只在详情返回,列表适合按需展示。查询快照不授予执行权;证据的 outcome 是 Worker 原始声明,EVIDENCE_ONLY 不能当作任务成功。当前权威任务结果用 GetTask 核对。
|
查询证据对应 `ListAttemptEvidence(ctx, taskID, attemptID, pageRequest)` 与 `GetAttemptEvidence(ctx, taskID, attemptID, evidenceID)`,列表相同方式使用 NextCursor。结果正文只在详情返回,列表适合按需展示。查询快照不授予执行权;证据的 outcome 是 Worker 原始声明,EVIDENCE_ONLY 不能当作任务成功。当前权威任务结果用 GetTask 核对。
|
||||||
|
|
||||||
完整 [执行历史示例](../../sdk/go/examples/history/main.go) 会创建一条模拟任务,提交固定成功结果,再模拟矛盾报告,并通过上述四个查询核对历史。先按 [Worker 初始化步骤](worker.md#1-可运行的文本规范化示例) 准备具有提交、读取及 Worker 权限的专用凭据,再从仓库根目录执行:
|
完整 [执行历史示例](../../examples/history/main.go) 会创建一条模拟任务,提交固定成功结果,再模拟矛盾报告,并通过上述四个查询核对历史。先按 [Worker 初始化步骤](worker.md#1-可运行的文本规范化示例) 准备具有提交、读取及 Worker 权限的专用凭据,再从仓库根目录执行:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cd sdk/go
|
cd examples
|
||||||
ORBIT_URL=http://127.0.0.1:8080 \
|
ORBIT_URL=http://127.0.0.1:8080 \
|
||||||
ORBIT_CREDENTIALS_FILE=../../.local/worker.credentials.json \
|
ORBIT_CREDENTIALS_FILE=../.local/worker.credentials.json \
|
||||||
go run ./examples/history
|
go run ./history
|
||||||
```
|
```
|
||||||
|
|
||||||
预期输出:
|
预期输出:
|
||||||
@@ -216,7 +216,7 @@ P2 已提供底层协议、[自动 Worker 运行器及示例](worker-runtime.md)
|
|||||||
|
|
||||||
## 订阅管理示例
|
## 订阅管理示例
|
||||||
|
|
||||||
[完整运行方法](../examples/subscriptions.md) 使用显式 --event-access 凭据,执行创建/同键核对/暂停/恢复/查询,再暂停本次订阅并保留审计。源码见 [examples/subscriptions](../../sdk/go/examples/subscriptions/main.go)。WSS 连接 SDK 与自动消费器见 [消费手册](event-consumer.md),可运行 [协议示例](../examples/event-protocol.md) 验证跨连接 ACK;[持久化 Inbox 示例](../examples/result-inbox.md) 已独立交付,核心SDK不新增数据库驱动。
|
[完整运行方法](../examples/subscriptions.md) 使用显式 --event-access 凭据,执行创建/同键核对/暂停/恢复/查询,再暂停本次订阅并保留审计。源码见 [examples/subscriptions](../../examples/subscriptions/main.go)。WSS 连接 SDK 与自动消费器见 [消费手册](event-consumer.md),可运行 [协议示例](../examples/event-protocol.md) 验证跨连接 ACK;[持久化 Inbox 示例](../examples/result-inbox.md) 已独立交付,核心SDK不新增数据库驱动。
|
||||||
|
|
||||||
## 流程定义发布
|
## 流程定义发布
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
# SDK 与协议兼容矩阵
|
# SDK 与协议兼容矩阵
|
||||||
|
|
||||||
当前发布线是 HTTP `/v1`、Worker WebSocket `pulse.worker.v1`、结果事件 WebSocket `orbit.events.v1`、Worker/事件帧 `protocol_version=1`、流程定义 `schema_version=1`,数据库要求 MySQL 8.4+ 与 Orbit schema v28。协议门禁由 `make protocol-check` 执行,检查服务端常量、SDK 常量、路由和机器可读 schema 是否一致。
|
当前发布线是 HTTP `/v1`、Worker WebSocket `pulse.worker.v1`、结果事件 WebSocket `orbit.events.v1`、Worker/事件帧 `protocol_version=1`、流程定义 `schema_version=1`,数据库要求 MySQL 8.4+ 与 Orbit schema v31。协议门禁由 `make protocol-check` 执行,检查服务端常量、SDK 常量、路由和机器可读 schema 是否一致。
|
||||||
|
|
||||||
| SDK / 客户端 | 服务端 | 当前证据 | 结论 |
|
| SDK / 客户端 | 服务端 | 当前证据 | 结论 |
|
||||||
| --- | --- | --- | --- |
|
| --- | --- | --- | --- |
|
||||||
| 当前仓库 SDK | 当前仓库服务端 | `scripts/test-protocol-compatibility.sh`、SDK 单元/竞态测试、HTTP/WSS 集成测试 | 已验证 |
|
| 当前仓库 SDK | 当前仓库服务端 | `scripts/test-protocol-compatibility.sh`、SDK 单元/竞态测试、HTTP/WSS 集成测试 | 已验证 |
|
||||||
| 历史提交 `a50d5fa` SDK | 当前服务端 | `make mysql-compatibility`,真实 MySQL/HTTP 任务 API 双向演练 | 任务 API smoke 已验证;不是正式标签或全协议结论 |
|
| 历史提交 `a50d5fa` SDK | 当前服务端 | `make mysql-compatibility`,真实 MySQL/HTTP 任务 API 双向演练 | 任务 API smoke 已验证;不是正式标签或全协议结论 |
|
||||||
| 当前 SDK | 历史提交 `a50d5fa` 服务端 | `make mysql-compatibility`,真实 MySQL/HTTP 任务 API 双向演练 | 任务 API smoke 已验证;不是正式标签或全协议结论 |
|
| 当前 SDK | 历史提交 `a50d5fa` 服务端 | `make mysql-compatibility`,真实 MySQL/HTTP 任务 API 双向演练 | 任务 API smoke 已验证;不是正式标签或全协议结论 |
|
||||||
| 上一个正式 SDK 标签 | 当前服务端 | 仓库尚未发布正式 SDK 标签 | 未验证,不得宣称兼容 |
|
| 上一个正式 SDK 标签 | 当前服务端 | 已发布 `sdk/go/v0.1.0`;完整跨版本协议矩阵尚未验收 | 未验证,不得宣称兼容 |
|
||||||
| 当前 SDK | 上一个正式服务端标签 | 仓库尚未发布正式服务端标签 | 未验证,不得宣称兼容 |
|
| 当前 SDK | 上一个正式服务端标签 | 已发布 `v0.1.0`;完整跨版本协议矩阵尚未验收 | 未验证,不得宣称兼容 |
|
||||||
| 非 Go HTTP 客户端 | 当前服务端 | `/v1` 接口手册、严格输入和错误码回归 | 按接口手册逐项验证 |
|
| 非 Go HTTP 客户端 | 当前服务端 | `/v1` 接口手册、严格输入和错误码回归 | 按接口手册逐项验证 |
|
||||||
|
|
||||||
## 兼容规则
|
## 兼容规则
|
||||||
|
|||||||
@@ -5,10 +5,10 @@
|
|||||||
业务写库与提交 Orbit 是两次独立操作。Outbox 将业务变更和待发请求放在同一个业务数据库事务中,再通过后台发送器提交任务。提交响应丢失时复用原操作身份,避免业务记录已保存而任务丢失。
|
业务写库与提交 Orbit 是两次独立操作。Outbox 将业务变更和待发请求放在同一个业务数据库事务中,再通过后台发送器提交任务。提交响应丢失时复用原操作身份,避免业务记录已保存而任务丢失。
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
go get git.yuntuo.hk/k2safe/orbit/adapters/outbox/mysql@codex/orbit-foundation
|
go get git.yuntuo.hk/k2safe/orbit/adapters/outbox/mysql@v0.1.1
|
||||||
```
|
```
|
||||||
|
|
||||||
Go 会将分支解析为固定版本写入 go.mod。上线应固定已验证的版本,不在每次部署时追踪分支。本包要求 Go 1.27.1,使用 SDK v0.1.0 和 MySQL 8.4 验证;不向核心 SDK 加入 SQL/ORM 依赖,也不依赖 Orbit 服务端模型。其他数据库和 ORM 专用适配尚未提供。
|
对应 Git 标签为 `adapters/outbox/mysql/v0.1.1`;业务项目固定模块版本 `v0.1.1`,无需本地 `replace`。本包要求 Go 1.27.1,使用 SDK v0.1.0 和 MySQL 8.4 验证;不向核心 SDK 加入 SQL/ORM 依赖,也不依赖 Orbit 服务端模型。其他数据库和 ORM 专用适配尚未提供。
|
||||||
|
|
||||||
```go
|
```go
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -20,26 +20,28 @@ sh scripts/test-sdk-isolation.sh
|
|||||||
成功输出示例:
|
成功输出示例:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{"sdk_module":"git.yuntuo.hk/k2safe/orbit/sdk/go","independent":true,"package_count":30,"forbidden_dependencies":0}
|
{"sdk_module":"git.yuntuo.hk/k2safe/orbit/sdk/go","independent":true,"package_count":5,"forbidden_dependencies":0}
|
||||||
```
|
```
|
||||||
|
|
||||||
`package_count` 随示例增加而变化,不能作为兼容性版本号。门禁只证明源码在当前 Go 工具链下保持独立和可构建,不代表已经发布到远端模块代理,也不替代旧 SDK/新服务端和新 SDK/旧服务端的协议兼容矩阵。
|
示例已移到根目录独立 module;`package_count` 随 SDK 包增加而变化,不能作为兼容性版本号。门禁只证明源码在当前 Go 工具链下保持独立和可构建,不代表已经发布到远端模块代理,也不替代旧 SDK/新服务端和新 SDK/旧服务端的协议兼容矩阵。
|
||||||
|
|
||||||
协议版本、WebSocket 子协议、流程 schema 和数据库版本见[兼容矩阵](compatibility.md)。发布候选还必须执行仓库根目录的 `make protocol-check`;它检查当前服务端、SDK 和机器可读 schema 是否仍在同一协议线,不把历史版本组合标记为已验证。
|
协议版本、WebSocket 子协议、流程 schema 和数据库版本见[兼容矩阵](compatibility.md)。发布候选还必须执行仓库根目录的 `make protocol-check`;它检查当前服务端、SDK 和机器可读 schema 是否仍在同一协议线,不把历史版本组合标记为已验证。
|
||||||
|
|
||||||
## 接入方式
|
## 接入方式
|
||||||
|
|
||||||
首个接入版本为 `v0.1.0`,需要 Go 1.27.1 或更高版本。接入方应固定 SDK 版本,升级前先执行自己的接口和业务幂等回归:
|
当前接入版本为 `v0.1.1`,需要 Go 1.27.1 或更高版本。接入方应固定 SDK 版本,升级前先执行自己的接口和业务幂等回归:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
go get git.yuntuo.hk/k2safe/orbit/sdk/go@v0.1.0
|
go get git.yuntuo.hk/k2safe/orbit/sdk/go@v0.1.1
|
||||||
# 在业务代码导入 SDK 并添加调用后:
|
# 在业务代码导入 SDK 并添加调用后:
|
||||||
go mod tidy
|
go mod tidy
|
||||||
go mod verify
|
go mod verify
|
||||||
```
|
```
|
||||||
|
|
||||||
仓库主分支为 `main`。服务端标签 `v0.1.0` 和独立 SDK 标签 `sdk/go/v0.1.0` 指向同一发布提交;Go 子模块标签必须包含 `sdk/go/` 前缀,业务端的模块版本不带此前缀。已发布标签保持不可变,修复使用新的补丁版本。`v0.1.0` 用于开发与测试接入,正式生产仍需完成[交付核对清单](../release-checklist.md)。
|
仓库主分支为 `main`。服务端标签 `v0.1.1` 和独立 SDK 标签 `sdk/go/v0.1.1` 指向同一发布提交;Go 子模块标签必须包含 `sdk/go/` 前缀,业务端的模块版本不带此前缀。已发布标签保持不可变,修复使用新的补丁版本。版本发布不替代目标环境验收,正式生产仍需完成[交付核对清单](../release-checklist.md)。
|
||||||
|
|
||||||
`v0.1.0` 已在仓库外的新业务 module、空模块缓存和 `GOWORK=off` 下通过公开远端下载、`go mod tidy`、编译、SDK HTTP smoke 和 `go mod verify`,解析版本精确为 `v0.1.0` 且不存在 `Replace`。发布提交、校验和与网络条件见[远端验证报告](../reports/phase-7-sdk-remote-release.md)。后续发布继续重复这一步,并按[兼容矩阵](compatibility.md)验证旧/新组合。
|
`v0.1.0` 已在仓库外的新业务 module、空模块缓存和 `GOWORK=off` 下通过公开远端下载、`go mod tidy`、编译、SDK HTTP smoke 和 `go mod verify`,解析版本精确为 `v0.1.0` 且不存在 `Replace`。发布提交、校验和与网络条件见[远端验证报告](../reports/phase-7-sdk-remote-release.md)。后续发布继续重复这一步,并按[兼容矩阵](compatibility.md)验证旧/新组合。
|
||||||
|
|
||||||
本地联调可以临时添加 `replace`,但不能提交到业务项目的发布分支。SDK 不负责 TLS 终止、凭据托管、对象存储或外部副作用核查;这些边界仍由平台接口手册和接入方运行手册定义。
|
本地联调可以临时添加 `replace`,但不能提交到业务项目的发布分支。SDK 不负责 TLS 终止、凭据托管、对象存储或外部副作用核查;这些边界仍由平台接口手册和接入方运行手册定义。
|
||||||
|
|
||||||
|
Outbox 独立模块使用 `adapters/outbox/mysql/v0.1.1` 标签,安装与版本边界见[适配包手册](outbox-mysql.md)。本次目录整理、发布与远端取包验证见[v0.1.1 记录](../reports/v0.1.1-release.md)。
|
||||||
|
|||||||
@@ -2,17 +2,17 @@
|
|||||||
|
|
||||||
更新:2026-09-17。自动 Worker 已实现,并通过真实 MySQL、实际服务命令、WSS 断线/ACK 丢失/持续断网及 [进程强杀恢复回归](../reports/phase-2.md)。[尝试与证据查询](../api/execution-history.md) 可核对结果,协议形状见 [Schema](../api/worker-schema.md)。
|
更新:2026-09-17。自动 Worker 已实现,并通过真实 MySQL、实际服务命令、WSS 断线/ACK 丢失/持续断网及 [进程强杀恢复回归](../reports/phase-2.md)。[尝试与证据查询](../api/execution-history.md) 可核对结果,协议形状见 [Schema](../api/worker-schema.md)。
|
||||||
|
|
||||||
源码:[运行器](../../sdk/go/worker_runtime.go)、[配置与中文注释](../../sdk/go/worker_runtime_types.go)、[完整示例](../../sdk/go/examples/worker/main.go)。特殊传输集成可以使用 [底层协议 SDK](worker.md),普通消费直接使用本页的 Worker。
|
源码:[运行器](../../sdk/go/worker_runtime.go)、[配置与中文注释](../../sdk/go/worker_runtime_types.go)、[完整示例](../../examples/worker/main.go)。特殊传输集成可以使用 [底层协议 SDK](worker.md),普通消费直接使用本页的 Worker。
|
||||||
|
|
||||||
## 1. 运行完整示例
|
## 1. 运行完整示例
|
||||||
|
|
||||||
按 [底层 SDK 的初始化步骤](worker.md#1-可运行的文本规范化示例) 创建具有 Worker 权限的专用凭据,在仓库根目录执行:
|
按 [底层 SDK 的初始化步骤](worker.md#1-可运行的文本规范化示例) 创建具有 Worker 权限的专用凭据,在仓库根目录执行:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cd sdk/go
|
cd examples
|
||||||
ORBIT_URL=http://127.0.0.1:8080 \
|
ORBIT_URL=http://127.0.0.1:8080 \
|
||||||
ORBIT_CREDENTIALS_FILE=../../.local/worker.credentials.json \
|
ORBIT_CREDENTIALS_FILE=../.local/worker.credentials.json \
|
||||||
go run ./examples/worker
|
go run ./worker
|
||||||
```
|
```
|
||||||
|
|
||||||
示例提交三条文本任务,以容量 2 启动自动 Worker,真实执行文本规范化,查询结果后取消 Run context 并等待排空。预期输出:
|
示例提交三条文本任务,以容量 2 启动自动 Worker,真实执行文本规范化,查询结果后取消 Run context 并等待排空。预期输出:
|
||||||
|
|||||||
@@ -14,10 +14,10 @@ chmod 700 .local
|
|||||||
go run ./cmd/orbit-admin bootstrap \
|
go run ./cmd/orbit-admin bootstrap \
|
||||||
--application worker-example --namespace default --environment development \
|
--application worker-example --namespace default --environment development \
|
||||||
--queue normalization --worker-access --output .local/worker.credentials.json
|
--queue normalization --worker-access --output .local/worker.credentials.json
|
||||||
cd sdk/go
|
cd examples
|
||||||
ORBIT_URL=http://127.0.0.1:8080 \
|
ORBIT_URL=http://127.0.0.1:8080 \
|
||||||
ORBIT_CREDENTIALS_FILE=../../.local/worker.credentials.json \
|
ORBIT_CREDENTIALS_FILE=../.local/worker.credentials.json \
|
||||||
go run ./examples/worker-protocol
|
go run ./worker-protocol
|
||||||
```
|
```
|
||||||
|
|
||||||
预期输出:
|
预期输出:
|
||||||
@@ -26,7 +26,7 @@ ORBIT_URL=http://127.0.0.1:8080 \
|
|||||||
task=<32位任务ID> final_state=SUCCEEDED attempts=1 result={"text":"HELLO ORBIT"}
|
task=<32位任务ID> final_state=SUCCEEDED attempts=1 result={"text":"HELLO ORBIT"}
|
||||||
```
|
```
|
||||||
|
|
||||||
[完整源码](../../sdk/go/examples/worker-protocol/main.go) 实际提交 `{"text":" Hello Orbit "}`,领取并取得开始授权,执行去首尾空格/转大写,报告结果、查询当前状态并排空。没有生成文件或调用外部服务。每次运行创建独立任务与临时处理器名,避免消费前次示例遗留任务;历史和审计保留,不硬删除。
|
[完整源码](../../examples/worker-protocol/main.go) 实际提交 `{"text":" Hello Orbit "}`,领取并取得开始授权,执行去首尾空格/转大写,报告结果、查询当前状态并排空。没有生成文件或调用外部服务。每次运行创建独立任务与临时处理器名,避免消费前次示例遗留任务;历史和审计保留,不硬删除。
|
||||||
|
|
||||||
安全重试可通过 `WorkerFinish.Retryable=true` 声明明确失败允许再试,仅适用于 WorkerFailed;省略为 false。新尝试由服务端决定,详见 [安全重试](../api/retries.md)。
|
安全重试可通过 `WorkerFinish.Retryable=true` 声明明确失败允许再试,仅适用于 WorkerFailed;省略为 false。新尝试由服务端决定,详见 [安全重试](../api/retries.md)。
|
||||||
|
|
||||||
|
|||||||
106
examples/README.md
Normal file
106
examples/README.md
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
# Orbit 可运行示例
|
||||||
|
|
||||||
|
这里集中提供 27 个场景:24 个轻量 SDK 程序和 3 个包含业务数据库的完整工程。每个目录的 README 都有用途、前置条件、运行命令、预期结果及详细接口链接。
|
||||||
|
|
||||||
|
## 第一次使用
|
||||||
|
|
||||||
|
1. 按[根 README](../README.md#快速开始)迁移数据库、设置管理员并启动 Orbit。
|
||||||
|
2. 从 `health` 检查服务,再运行 `worker` 看完整提交与执行结果。
|
||||||
|
3. 接入已有业务优先阅读 `http-service`;只需要事务发送器,使用公共 [Outbox 适配包](../adapters/outbox/mysql/README.md)。
|
||||||
|
|
||||||
|
轻量示例在根 `examples/go.mod` 中,仓库 `go.work` 联调本地 SDK;`GOWORK=off` 时使用已发布的最低兼容版本 v0.1.0。v0.1.1 的这些 SDK API 保持不变。三个业务工程各有独立 go.mod,用 `GOWORK=off` 运行;它们保留仓库内开发用的 replace。**业务方自己的项目安装正式 v0.1.1,无需复制这些 replace。**
|
||||||
|
|
||||||
|
从仓库根目录执行:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
export ORBIT_URL=http://127.0.0.1:8080
|
||||||
|
export ORBIT_CREDENTIALS_FILE="$PWD/.local/development.credentials.json"
|
||||||
|
cd examples
|
||||||
|
go run ./health
|
||||||
|
go run ./worker
|
||||||
|
```
|
||||||
|
|
||||||
|
SDK 凭据是程序调用接口的身份,不是业务数据。任务、流程、结果与审计在 MySQL;控制台使用账号密码登录,无需上传凭据文件。
|
||||||
|
|
||||||
|
## 全部示例
|
||||||
|
|
||||||
|
| 目录 | 功能 | 本例实际演示 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| [health](health/README.md) | 健康检查 | 查询存活、数据库/迁移就绪状态与运行版本。 |
|
||||||
|
| [tasks](tasks/README.md) | 任务提交与幂等 | 同一请求提交两次,查询任务和直接来源,再按版本取消。 |
|
||||||
|
| [worker](worker/README.md) | 自动 Worker | 注册文本处理器,执行三条任务,确认结果后有界排空。 |
|
||||||
|
| [file-conversion](file-conversion/README.md) | CSV 转 JSON | 提交小型 CSV 内容,Worker 转为 JSON,并核对行数和输出。 |
|
||||||
|
| [delayed-task](delayed-task/README.md) | 延迟任务 | 等待 1500 毫秒后执行,核对未提前开始及原受理回执。 |
|
||||||
|
| [batch](batch/README.md) | 批量与部分补交 | 三项受理中两项成功、一项满额;原身份核对并只补交失败项。 |
|
||||||
|
| [retry](retry/README.md) | 有限安全重试 | 第一次明确失败且未产生效果,退避后第二次成功。 |
|
||||||
|
| [cancellation](cancellation/README.md) | 运行中取消 | 处理器收到取消意图后配合停止,确认没有未结清效果。 |
|
||||||
|
| [task-query](task-query/README.md) | 任务筛选与分页 | 按精确业务键和创建时间翻页,核对时间上界与原载荷,再取消收尾。 |
|
||||||
|
| [history](history/README.md) | 执行历史与迟到证据 | 保存成功结果后提交冲突报告,查询尝试及证据,确认原结果没有被覆盖。 |
|
||||||
|
| [recovery](recovery/README.md) | 人工核查与关联重试 | 模拟未知效果,凭证据核查为失败,再创建关联的新任务并成功执行。 |
|
||||||
|
| [schedules](schedules/README.md) | 定时计划 | 创建有限周期计划,恢复运行,读取固定版本触发来源,最后暂停并排空。 |
|
||||||
|
| [resources](resources/README.md) | 队列配额与限速 | 制造队列积压背压,释放额度后以原身份补交,并验证受控执行。 |
|
||||||
|
| [application-resources](application-resources/README.md) | 跨命名空间共享额度 | 同一应用下两个命名空间共享上限,释放后原身份重报,并恢复配置。 |
|
||||||
|
| [keyed-concurrency](keyed-concurrency/README.md) | 跨队列资源互斥 | 两队列操作同一资源键,验证许可序号递增及资源端拒绝旧写。 |
|
||||||
|
| [priority](priority/README.md) | 优先级 | 以单执行槽展示近同时到期的任务按 9、4、0 优先级执行。 |
|
||||||
|
| [subscriptions](subscriptions/README.md) | 结果订阅管理 | 创建订阅、同键核对、暂停、恢复及查询,最后暂停本次订阅。 |
|
||||||
|
| [event-protocol](event-protocol/README.md) | WebSocket 结果通知与 ACK | 接收取消事件并确认,断开后重报原证明,验证 ACK 去重。 |
|
||||||
|
| [worker-protocol](worker-protocol/README.md) | Worker 底层协议 | 手动完成注册、领取、开始授权、结果确认和查询,了解协议边界。 |
|
||||||
|
| [workflow-definition](workflow-definition/README.md) | 流程定义与版本发布 | 研发通过 SDK 定义并发布 v1/v2,核对原版本与结构预算。 |
|
||||||
|
| [workflow](workflow/README.md) | 并行流程、汇合与信号 | 两条并行任务汇合,等待信号后推进,并查询来源和状态时间线。 |
|
||||||
|
| [workflow-query](workflow-query/README.md) | 流程实例筛选与分页 | 创建带业务键的实例,按业务键/状态/时间分页并核对尾部空格精确匹配。 |
|
||||||
|
| [workflow-poll](workflow-poll/README.md) | 有界查询 | 提交外部作业一次,区分处理中轮次与请求失败重试,并演示轮次耗尽。 |
|
||||||
|
| [workflow-recovery](workflow-recovery/README.md) | 流程证据核查与恢复 | 外部受理后丢响应,按证据核查、解决步骤、解除核查并显式恢复暂停。 |
|
||||||
|
| [task-outbox](task-outbox/README.md) | 业务事务 Outbox | 业务记录与待发请求同事务,后台提交及原身份恢复 |
|
||||||
|
| [result-inbox](result-inbox/README.md) | 业务结果 Inbox | 同事务去重和更新业务视图,提交后 ACK |
|
||||||
|
| [http-service](http-service/README.md) | 嵌入 HTTP 服务 | HTTP → Outbox → Worker → 结果 Inbox,完整启动、就绪和关闭 |
|
||||||
|
|
||||||
|
## 权限与准备
|
||||||
|
|
||||||
|
根 README 的快速开始凭据用于专用演示环境,包含 Worker、计划、订阅、任务恢复和全部流程权限。若单独初始化,按各例要求选择:
|
||||||
|
|
||||||
|
| 能力 | bootstrap 参数 |
|
||||||
|
| --- | --- |
|
||||||
|
| Worker 执行 | `--worker-access` |
|
||||||
|
| 定时计划 | `--schedule-access` |
|
||||||
|
| 结果订阅 | `--event-access` |
|
||||||
|
| 独立任务核查/重试 | `--recovery-access` |
|
||||||
|
| 定义发布 | `--workflow-access` |
|
||||||
|
| 实例启动/读取 | `--workflow-run-access` |
|
||||||
|
| 暂停/恢复/取消 | `--workflow-control-access` |
|
||||||
|
| 外部信号 | `--workflow-signal-access` |
|
||||||
|
| 步骤核查/恢复 | `--workflow-recovery-access` |
|
||||||
|
| 流程审计/时间线 | `--workflow-audit-access` |
|
||||||
|
| 应用共享额度 | `--resource-access`,见 application-resources 的双命名空间初始化 |
|
||||||
|
|
||||||
|
已有凭据不会因修改命令自动增加权限。不要重复 bootstrap 覆盖原凭据;需要另一个场景时按对应手册创建独立示例应用并保存新文件。生产凭据按实际角色和队列收紧权限。
|
||||||
|
|
||||||
|
需要完整流程演示凭据时,在已配置 `ORBIT_MYSQL_DSN` 的仓库根目录执行一次:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
umask 077
|
||||||
|
mkdir -p .local
|
||||||
|
go run ./cmd/orbit-admin bootstrap \
|
||||||
|
--application workflow-examples --namespace default --environment development \
|
||||||
|
--queue workflow --worker-access --workflow-access --workflow-run-access \
|
||||||
|
--workflow-control-access --workflow-signal-access --workflow-recovery-access \
|
||||||
|
--workflow-audit-access --output .local/workflow.credentials.json
|
||||||
|
export ORBIT_CREDENTIALS_FILE="$PWD/.local/workflow.credentials.json"
|
||||||
|
cd examples
|
||||||
|
go run ./workflow
|
||||||
|
go run ./workflow-poll
|
||||||
|
go run ./workflow-recovery
|
||||||
|
```
|
||||||
|
|
||||||
|
三个业务数据库工程的 `init` 仅用于新建专用空库;连接配置、命令参数与 API 请求分别在各自 README 链接的运行手册中。其数据库不能用 Orbit 平台库替代。
|
||||||
|
|
||||||
|
## 执行与恢复约定
|
||||||
|
|
||||||
|
- `ACCEPTED` 是任务已被平台受理;执行成功以查询或结果事件为准。
|
||||||
|
- 短示例通常随机创建身份用于独立演示;重启短示例不是恢复旧业务,持久恢复参考 Outbox/Inbox 工程。
|
||||||
|
- `PENDING` 查询结果表示继续等待,网络失败重试属于另一层预算。
|
||||||
|
- 示例使用真实接口并保留审计,不清空平台数据库。订阅、定义和队列会累计,应在专用环境演练。
|
||||||
|
- 外部系统有未知效果时应核查;处理器自己的幂等、事务和证据不能由重连机制替代。
|
||||||
|
|
||||||
|
## 回归
|
||||||
|
|
||||||
|
从仓库根目录执行 `make test vet build` 覆盖全部示例模块;`make integration` 使用临时 MySQL 和真实 Orbit 进程运行场景与故障测试。仅跑 `go test ./...` 而未提供集成环境时,外部服务用例会跳过。
|
||||||
31
examples/application-resources/README.md
Normal file
31
examples/application-resources/README.md
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
# 跨命名空间共享额度
|
||||||
|
|
||||||
|
同一应用下两个命名空间共享上限,释放后原身份重报,并恢复配置。
|
||||||
|
|
||||||
|
## 准备
|
||||||
|
|
||||||
|
- Go 1.27.1、当前版本 Orbit;服务启动和初始化见[仓库 README](../../README.md#快速开始)。
|
||||||
|
- 须按详细手册创建同一专用应用下的两个命名空间,两个凭据均增加 --resource-access。不能直接使用单份快速开始凭据。
|
||||||
|
- [示例总索引](../README.md)提供统一初始化和权限说明;完整字段、失败处理见[详细手册](../../docs/api/application-resources.md)。
|
||||||
|
|
||||||
|
## 运行
|
||||||
|
|
||||||
|
以下命令从仓库根目录执行;凭据路径替换为实际初始化输出。
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd examples
|
||||||
|
export ORBIT_URL=http://127.0.0.1:8080
|
||||||
|
export ORBIT_CREDENTIALS_FILE="$PWD/../.local/app-first.credentials.json"
|
||||||
|
export ORBIT_SECOND_CREDENTIALS_FILE="$PWD/../.local/app-second.credentials.json"
|
||||||
|
go run ./application-resources
|
||||||
|
```
|
||||||
|
|
||||||
|
## 结果核对
|
||||||
|
|
||||||
|
cross_namespace_backpressure=APPLICATION_FULL http=429;same_identity_retry_accepted=true;unfinished=0。具体 ID 和统计值以本次运行为准。程序会核对上述关键条件,失败时打印错误并以非零状态退出。
|
||||||
|
|
||||||
|
## 接入自己的项目
|
||||||
|
|
||||||
|
阅读[main.go](main.go)中的客户端创建、请求及错误处理。业务项目通过 `go get git.yuntuo.hk/k2safe/orbit/sdk/go@v0.1.1` 引入 SDK,无需导入本示例包。
|
||||||
|
|
||||||
|
示例运行会写入真实平台数据,应使用专用测试应用/队列。正常结束保留历史和审计;重复演示通常创建新身份,不能当作上次失败操作的恢复。真实业务应在第一次请求前持久化操作身份,网络结果不明时沿原身份核对。
|
||||||
30
examples/batch/README.md
Normal file
30
examples/batch/README.md
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# 批量与部分补交
|
||||||
|
|
||||||
|
三项受理中两项成功、一项满额;原身份核对并只补交失败项。
|
||||||
|
|
||||||
|
## 准备
|
||||||
|
|
||||||
|
- Go 1.27.1、当前版本 Orbit;服务启动和初始化见[仓库 README](../../README.md#快速开始)。
|
||||||
|
- 队列创建/配置和任务权限;使用允许创建新队列的示例凭据,不需要 Worker。
|
||||||
|
- [示例总索引](../README.md)提供统一初始化和权限说明;完整字段、失败处理见[详细手册](../../docs/examples/batch.md)。
|
||||||
|
|
||||||
|
## 运行
|
||||||
|
|
||||||
|
以下命令从仓库根目录执行;凭据路径替换为实际初始化输出。
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd examples
|
||||||
|
export ORBIT_URL=http://127.0.0.1:8080
|
||||||
|
export ORBIT_CREDENTIALS_FILE="$PWD/../.local/development.credentials.json"
|
||||||
|
go run ./batch
|
||||||
|
```
|
||||||
|
|
||||||
|
## 结果核对
|
||||||
|
|
||||||
|
accepted=2 rejected=1;replayed=2;retried_items=1;unfinished=0。具体 ID 和统计值以本次运行为准。程序会核对上述关键条件,失败时打印错误并以非零状态退出。
|
||||||
|
|
||||||
|
## 接入自己的项目
|
||||||
|
|
||||||
|
阅读[main.go](main.go)中的客户端创建、请求及错误处理。业务项目通过 `go get git.yuntuo.hk/k2safe/orbit/sdk/go@v0.1.1` 引入 SDK,无需导入本示例包。
|
||||||
|
|
||||||
|
示例运行会写入真实平台数据,应使用专用测试应用/队列。正常结束保留历史和审计;重复演示通常创建新身份,不能当作上次失败操作的恢复。真实业务应在第一次请求前持久化操作身份,网络结果不明时沿原身份核对。
|
||||||
30
examples/cancellation/README.md
Normal file
30
examples/cancellation/README.md
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# 运行中取消
|
||||||
|
|
||||||
|
处理器收到取消意图后配合停止,确认没有未结清效果。
|
||||||
|
|
||||||
|
## 准备
|
||||||
|
|
||||||
|
- Go 1.27.1、当前版本 Orbit;服务启动和初始化见[仓库 README](../../README.md#快速开始)。
|
||||||
|
- 初始化时增加 --worker-access;还需任务取消权限。
|
||||||
|
- [示例总索引](../README.md)提供统一初始化和权限说明;完整字段、失败处理见[详细手册](../../docs/api/cancellation.md)。
|
||||||
|
|
||||||
|
## 运行
|
||||||
|
|
||||||
|
以下命令从仓库根目录执行;凭据路径替换为实际初始化输出。
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd examples
|
||||||
|
export ORBIT_URL=http://127.0.0.1:8080
|
||||||
|
export ORBIT_CREDENTIALS_FILE="$PWD/../.local/development.credentials.json"
|
||||||
|
go run ./cancellation
|
||||||
|
```
|
||||||
|
|
||||||
|
## 结果核对
|
||||||
|
|
||||||
|
accepted_state=RUNNING;final_state=CANCELLED;worker_drained=true。具体 ID 和统计值以本次运行为准。程序会核对上述关键条件,失败时打印错误并以非零状态退出。
|
||||||
|
|
||||||
|
## 接入自己的项目
|
||||||
|
|
||||||
|
阅读[main.go](main.go)中的客户端创建、请求及错误处理。业务项目通过 `go get git.yuntuo.hk/k2safe/orbit/sdk/go@v0.1.1` 引入 SDK,无需导入本示例包。
|
||||||
|
|
||||||
|
示例运行会写入真实平台数据,应使用专用测试应用/队列。正常结束保留历史和审计;重复演示通常创建新身份,不能当作上次失败操作的恢复。真实业务应在第一次请求前持久化操作身份,网络结果不明时沿原身份核对。
|
||||||
30
examples/delayed-task/README.md
Normal file
30
examples/delayed-task/README.md
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# 延迟任务
|
||||||
|
|
||||||
|
等待 1500 毫秒后执行,核对未提前开始及原受理回执。
|
||||||
|
|
||||||
|
## 准备
|
||||||
|
|
||||||
|
- Go 1.27.1、当前版本 Orbit;服务启动和初始化见[仓库 README](../../README.md#快速开始)。
|
||||||
|
- 初始化时增加 --worker-access。
|
||||||
|
- [示例总索引](../README.md)提供统一初始化和权限说明;完整字段、失败处理见[详细手册](../../docs/examples/delayed-task.md)。
|
||||||
|
|
||||||
|
## 运行
|
||||||
|
|
||||||
|
以下命令从仓库根目录执行;凭据路径替换为实际初始化输出。
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd examples
|
||||||
|
export ORBIT_URL=http://127.0.0.1:8080
|
||||||
|
export ORBIT_CREDENTIALS_FILE="$PWD/../.local/development.credentials.json"
|
||||||
|
go run ./delayed-task
|
||||||
|
```
|
||||||
|
|
||||||
|
## 结果核对
|
||||||
|
|
||||||
|
no_early_start=true original_receipt=true worker_drained=true。具体 ID 和统计值以本次运行为准。程序会核对上述关键条件,失败时打印错误并以非零状态退出。
|
||||||
|
|
||||||
|
## 接入自己的项目
|
||||||
|
|
||||||
|
阅读[main.go](main.go)中的客户端创建、请求及错误处理。业务项目通过 `go get git.yuntuo.hk/k2safe/orbit/sdk/go@v0.1.1` 引入 SDK,无需导入本示例包。
|
||||||
|
|
||||||
|
示例运行会写入真实平台数据,应使用专用测试应用/队列。正常结束保留历史和审计;重复演示通常创建新身份,不能当作上次失败操作的恢复。真实业务应在第一次请求前持久化操作身份,网络结果不明时沿原身份核对。
|
||||||
32
examples/event-protocol/README.md
Normal file
32
examples/event-protocol/README.md
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# WebSocket 结果通知与 ACK
|
||||||
|
|
||||||
|
接收取消事件并确认,断开后重报原证明,验证 ACK 去重。
|
||||||
|
|
||||||
|
## 准备
|
||||||
|
|
||||||
|
- Go 1.27.1、当前版本 Orbit;服务启动和初始化见[仓库 README](../../README.md#快速开始)。
|
||||||
|
- 初始化时增加 --event-access;用隔离队列运行,避免混入其他取消事件。
|
||||||
|
- [示例总索引](../README.md)提供统一初始化和权限说明;完整字段、失败处理见[详细手册](../../docs/examples/event-protocol.md)。
|
||||||
|
|
||||||
|
## 运行
|
||||||
|
|
||||||
|
以下命令从仓库根目录执行;凭据路径替换为实际初始化输出。
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd examples
|
||||||
|
export ORBIT_URL=http://127.0.0.1:8080
|
||||||
|
export ORBIT_CREDENTIALS_FILE="$PWD/../.local/development.credentials.json"
|
||||||
|
go run ./event-protocol
|
||||||
|
```
|
||||||
|
|
||||||
|
## 结果核对
|
||||||
|
|
||||||
|
ack_replayed=true same_receipt=true pending=0 subscription_enabled=false。具体 ID 和统计值以本次运行为准。程序会核对上述关键条件,失败时打印错误并以非零状态退出。
|
||||||
|
|
||||||
|
## 接入自己的项目
|
||||||
|
|
||||||
|
阅读[main.go](main.go)中的客户端创建、请求及错误处理。业务项目通过 `go get git.yuntuo.hk/k2safe/orbit/sdk/go@v0.1.1` 引入 SDK,无需导入本示例包。
|
||||||
|
|
||||||
|
示例运行会写入真实平台数据,应使用专用测试应用/队列。正常结束保留历史和审计;重复演示通常创建新身份,不能当作上次失败操作的恢复。真实业务应在第一次请求前持久化操作身份,网络结果不明时沿原身份核对。
|
||||||
|
|
||||||
|
每次演示保留一个暂停订阅,命名空间最多 64 个订阅;不要将重复运行示例作为持续消费者。
|
||||||
30
examples/file-conversion/README.md
Normal file
30
examples/file-conversion/README.md
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# CSV 转 JSON
|
||||||
|
|
||||||
|
提交小型 CSV 内容,Worker 转为 JSON,并核对行数和输出。
|
||||||
|
|
||||||
|
## 准备
|
||||||
|
|
||||||
|
- Go 1.27.1、当前版本 Orbit;服务启动和初始化见[仓库 README](../../README.md#快速开始)。
|
||||||
|
- 初始化时增加 --worker-access;输入内置,不需要外部文件存储。
|
||||||
|
- [示例总索引](../README.md)提供统一初始化和权限说明;完整字段、失败处理见[详细手册](../../docs/examples/file-conversion.md)。
|
||||||
|
|
||||||
|
## 运行
|
||||||
|
|
||||||
|
以下命令从仓库根目录执行;凭据路径替换为实际初始化输出。
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd examples
|
||||||
|
export ORBIT_URL=http://127.0.0.1:8080
|
||||||
|
export ORBIT_CREDENTIALS_FILE="$PWD/../.local/development.credentials.json"
|
||||||
|
go run ./file-conversion
|
||||||
|
```
|
||||||
|
|
||||||
|
## 结果核对
|
||||||
|
|
||||||
|
rows=2 state=SUCCEEDED worker_drained=true。具体 ID 和统计值以本次运行为准。程序会核对上述关键条件,失败时打印错误并以非零状态退出。
|
||||||
|
|
||||||
|
## 接入自己的项目
|
||||||
|
|
||||||
|
阅读[main.go](main.go)中的客户端创建、请求及错误处理。业务项目通过 `go get git.yuntuo.hk/k2safe/orbit/sdk/go@v0.1.1` 引入 SDK,无需导入本示例包。
|
||||||
|
|
||||||
|
示例运行会写入真实平台数据,应使用专用测试应用/队列。正常结束保留历史和审计;重复演示通常创建新身份,不能当作上次失败操作的恢复。真实业务应在第一次请求前持久化操作身份,网络结果不明时沿原身份核对。
|
||||||
7
examples/go.mod
Normal file
7
examples/go.mod
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
module git.yuntuo.hk/k2safe/orbit/examples
|
||||||
|
|
||||||
|
go 1.27.1
|
||||||
|
|
||||||
|
require git.yuntuo.hk/k2safe/orbit/sdk/go v0.1.0
|
||||||
|
|
||||||
|
require github.com/coder/websocket v1.8.15 // indirect
|
||||||
4
examples/go.sum
Normal file
4
examples/go.sum
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
git.yuntuo.hk/k2safe/orbit/sdk/go v0.1.0 h1:OJp+U8dDNKjiXy4ZhO4MMq68Ek8TkjphUAqsjOOg77c=
|
||||||
|
git.yuntuo.hk/k2safe/orbit/sdk/go v0.1.0/go.mod h1:9KlMW7Gy+EGaDoEwr3wHHFY47mnAymSfYeQpMS7h4ag=
|
||||||
|
github.com/coder/websocket v1.8.15 h1:6B2JPeOGlpff2Uz6vOEH1Vzpi0iUz20A+lPVhPHtNUA=
|
||||||
|
github.com/coder/websocket v1.8.15/go.mod h1:NX3SzP+inril6yawo5CQXx8+fk145lPDC6pumgx0mVg=
|
||||||
29
examples/health/README.md
Normal file
29
examples/health/README.md
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# 健康检查
|
||||||
|
|
||||||
|
查询存活、数据库/迁移就绪状态与运行版本。
|
||||||
|
|
||||||
|
## 准备
|
||||||
|
|
||||||
|
- Go 1.27.1、当前版本 Orbit;服务启动和初始化见[仓库 README](../../README.md#快速开始)。
|
||||||
|
- 无需凭据;服务地址必须可达。
|
||||||
|
- [示例总索引](../README.md)提供统一初始化和权限说明;完整字段、失败处理见[详细手册](../../docs/api/health.md)。
|
||||||
|
|
||||||
|
## 运行
|
||||||
|
|
||||||
|
以下命令从仓库根目录执行;凭据路径替换为实际初始化输出。
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd examples
|
||||||
|
export ORBIT_URL=http://127.0.0.1:8080
|
||||||
|
go run ./health
|
||||||
|
```
|
||||||
|
|
||||||
|
## 结果核对
|
||||||
|
|
||||||
|
liveness=alive readiness=ready scope=database_and_schema。具体 ID 和统计值以本次运行为准。程序会核对上述关键条件,失败时打印错误并以非零状态退出。
|
||||||
|
|
||||||
|
## 接入自己的项目
|
||||||
|
|
||||||
|
阅读[main.go](main.go)中的客户端创建、请求及错误处理。业务项目通过 `go get git.yuntuo.hk/k2safe/orbit/sdk/go@v0.1.1` 引入 SDK,无需导入本示例包。
|
||||||
|
|
||||||
|
本例只读,不创建任务、队列或订阅。
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
// Run against a started bootstrap server: ORBIT_URL=http://127.0.0.1:8080 go run ./examples/health
|
// Run against a started bootstrap server: ORBIT_URL=http://127.0.0.1:8080 go run ./health
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
30
examples/history/README.md
Normal file
30
examples/history/README.md
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# 执行历史与迟到证据
|
||||||
|
|
||||||
|
保存成功结果后提交冲突报告,查询尝试及证据,确认原结果没有被覆盖。
|
||||||
|
|
||||||
|
## 准备
|
||||||
|
|
||||||
|
- Go 1.27.1、当前版本 Orbit;服务启动和初始化见[仓库 README](../../README.md#快速开始)。
|
||||||
|
- 初始化时增加 --worker-access;此例使用底层协议构造受控冲突。
|
||||||
|
- [示例总索引](../README.md)提供统一初始化和权限说明;完整字段、失败处理见[详细手册](../../docs/sdk/README.md)。
|
||||||
|
|
||||||
|
## 运行
|
||||||
|
|
||||||
|
以下命令从仓库根目录执行;凭据路径替换为实际初始化输出。
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd examples
|
||||||
|
export ORBIT_URL=http://127.0.0.1:8080
|
||||||
|
export ORBIT_CREDENTIALS_FILE="$PWD/../.local/development.credentials.json"
|
||||||
|
go run ./history
|
||||||
|
```
|
||||||
|
|
||||||
|
## 结果核对
|
||||||
|
|
||||||
|
state=SUCCEEDED attempts=1 evidence=1 reason=RESULT_CONFLICT disposition=EVIDENCE_ONLY。具体 ID 和统计值以本次运行为准。程序会核对上述关键条件,失败时打印错误并以非零状态退出。
|
||||||
|
|
||||||
|
## 接入自己的项目
|
||||||
|
|
||||||
|
阅读[main.go](main.go)中的客户端创建、请求及错误处理。业务项目通过 `go get git.yuntuo.hk/k2safe/orbit/sdk/go@v0.1.1` 引入 SDK,无需导入本示例包。
|
||||||
|
|
||||||
|
示例运行会写入真实平台数据,应使用专用测试应用/队列。正常结束保留历史和审计;重复演示通常创建新身份,不能当作上次失败操作的恢复。真实业务应在第一次请求前持久化操作身份,网络结果不明时沿原身份核对。
|
||||||
@@ -9,3 +9,34 @@
|
|||||||
- [业务 Inbox 示例实现](internal/inbox/store.go),沿用独立 result-inbox 示例的事件去重与版本约束
|
- [业务 Inbox 示例实现](internal/inbox/store.go),沿用独立 result-inbox 示例的事件去重与版本约束
|
||||||
|
|
||||||
`init` 创建业务库表;`provision` 用稳定身份创建结果订阅;`serve` 使用配置中的订阅 ID,启动时无需 Orbit 在线。默认只监听回环地址 127.0.0.1:8090。接入已有服务时挂载业务路由,并接入原有鉴权、监控及生命周期。
|
`init` 创建业务库表;`provision` 用稳定身份创建结果订阅;`serve` 使用配置中的订阅 ID,启动时无需 Orbit 在线。默认只监听回环地址 127.0.0.1:8090。接入已有服务时挂载业务路由,并接入原有鉴权、监控及生命周期。
|
||||||
|
|
||||||
|
## 快速运行
|
||||||
|
|
||||||
|
先按上方完整手册创建专用 Orbit 队列/凭据(含 Worker 与事件权限)和一个独立空业务库。从仓库根目录执行,DSN 替换为自己的配置:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
export ORBIT_URL=http://127.0.0.1:8080
|
||||||
|
export ORBIT_CREDENTIALS_FILE="$PWD/.local/http-demo.credentials.json"
|
||||||
|
export APP_MYSQL_DSN='user:password@tcp(127.0.0.1:3306)/orbit_http_demo'
|
||||||
|
export APP_HTTP_ADDR=127.0.0.1:8090
|
||||||
|
cd examples/http-service
|
||||||
|
export GOWORK=off
|
||||||
|
go run ./cmd/server init
|
||||||
|
export ORBIT_SUBSCRIPTION_ID="$(go run ./cmd/server provision)"
|
||||||
|
go build -o server ./cmd/server
|
||||||
|
./server serve
|
||||||
|
```
|
||||||
|
|
||||||
|
`init` 只在首次空库执行;持久保存 provision 的订阅 ID,重启只运行 `serve`。另开终端:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
export OPERATION_ID="$(openssl rand -hex 16)"
|
||||||
|
curl --fail http://127.0.0.1:8090/jobs \
|
||||||
|
-H 'Content-Type: application/json' \
|
||||||
|
-d "{\"operation_id\":\"$OPERATION_ID\",\"source_ref\":\"objects/demo.txt\"}"
|
||||||
|
curl --fail "http://127.0.0.1:8090/jobs/$OPERATION_ID"
|
||||||
|
```
|
||||||
|
|
||||||
|
预期首次返回 `local_committed=true`;稍后 GET 显示 `submission=ACCEPTED`、`execution=SUCCEEDED`,结果包含 `normalized_ref=OBJECTS/DEMO.TXT`。同 ID、同内容重报返回 `duplicate=true`;相同 ID 改内容返回 409。超时后保留原 ID,不重新生成。
|
||||||
|
|
||||||
|
通过 Ctrl-C/SIGTERM 关闭时先停止接收 HTTP,再收尾发送器/Worker,之后停止结果消费,最后关闭数据库。完整错误码、故障恢复和部署关闭期限见运行手册。
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ module git.yuntuo.hk/k2safe/orbit/examples/http-service
|
|||||||
go 1.27.1
|
go 1.27.1
|
||||||
|
|
||||||
require (
|
require (
|
||||||
git.yuntuo.hk/k2safe/orbit/adapters/outbox/mysql v0.0.0
|
git.yuntuo.hk/k2safe/orbit/adapters/outbox/mysql v0.1.1
|
||||||
git.yuntuo.hk/k2safe/orbit/sdk/go v0.1.0
|
git.yuntuo.hk/k2safe/orbit/sdk/go v0.1.0
|
||||||
github.com/go-sql-driver/mysql v1.10.1
|
github.com/go-sql-driver/mysql v1.10.1
|
||||||
)
|
)
|
||||||
|
|||||||
30
examples/keyed-concurrency/README.md
Normal file
30
examples/keyed-concurrency/README.md
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# 跨队列资源互斥
|
||||||
|
|
||||||
|
两队列操作同一资源键,验证许可序号递增及资源端拒绝旧写。
|
||||||
|
|
||||||
|
## 准备
|
||||||
|
|
||||||
|
- Go 1.27.1、当前版本 Orbit;服务启动和初始化见[仓库 README](../../README.md#快速开始)。
|
||||||
|
- 队列创建权限;初始化时增加 --worker-access。资源端是受控内存模拟,生产须持久化核验序号。
|
||||||
|
- [示例总索引](../README.md)提供统一初始化和权限说明;完整字段、失败处理见[详细手册](../../docs/api/keyed-concurrency.md)。
|
||||||
|
|
||||||
|
## 运行
|
||||||
|
|
||||||
|
以下命令从仓库根目录执行;凭据路径替换为实际初始化输出。
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd examples
|
||||||
|
export ORBIT_URL=http://127.0.0.1:8080
|
||||||
|
export ORBIT_CREDENTIALS_FILE="$PWD/../.local/development.credentials.json"
|
||||||
|
go run ./keyed-concurrency
|
||||||
|
```
|
||||||
|
|
||||||
|
## 结果核对
|
||||||
|
|
||||||
|
queues=2 completed=2 tokens_increasing=true;stale_write_rejected=true。具体 ID 和统计值以本次运行为准。程序会核对上述关键条件,失败时打印错误并以非零状态退出。
|
||||||
|
|
||||||
|
## 接入自己的项目
|
||||||
|
|
||||||
|
阅读[main.go](main.go)中的客户端创建、请求及错误处理。业务项目通过 `go get git.yuntuo.hk/k2safe/orbit/sdk/go@v0.1.1` 引入 SDK,无需导入本示例包。
|
||||||
|
|
||||||
|
示例运行会写入真实平台数据,应使用专用测试应用/队列。正常结束保留历史和审计;重复演示通常创建新身份,不能当作上次失败操作的恢复。真实业务应在第一次请求前持久化操作身份,网络结果不明时沿原身份核对。
|
||||||
30
examples/priority/README.md
Normal file
30
examples/priority/README.md
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# 优先级
|
||||||
|
|
||||||
|
以单执行槽展示近同时到期的任务按 9、4、0 优先级执行。
|
||||||
|
|
||||||
|
## 准备
|
||||||
|
|
||||||
|
- Go 1.27.1、当前版本 Orbit;服务启动和初始化见[仓库 README](../../README.md#快速开始)。
|
||||||
|
- 队列创建权限;初始化时增加 --worker-access。
|
||||||
|
- [示例总索引](../README.md)提供统一初始化和权限说明;完整字段、失败处理见[详细手册](../../docs/api/priority-and-fairness.md)。
|
||||||
|
|
||||||
|
## 运行
|
||||||
|
|
||||||
|
以下命令从仓库根目录执行;凭据路径替换为实际初始化输出。
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd examples
|
||||||
|
export ORBIT_URL=http://127.0.0.1:8080
|
||||||
|
export ORBIT_CREDENTIALS_FILE="$PWD/../.local/development.credentials.json"
|
||||||
|
go run ./priority
|
||||||
|
```
|
||||||
|
|
||||||
|
## 结果核对
|
||||||
|
|
||||||
|
submitted_priorities=0,9,4 executed_priorities=9,4,0;completed=3。具体 ID 和统计值以本次运行为准。程序会核对上述关键条件,失败时打印错误并以非零状态退出。
|
||||||
|
|
||||||
|
## 接入自己的项目
|
||||||
|
|
||||||
|
阅读[main.go](main.go)中的客户端创建、请求及错误处理。业务项目通过 `go get git.yuntuo.hk/k2safe/orbit/sdk/go@v0.1.1` 引入 SDK,无需导入本示例包。
|
||||||
|
|
||||||
|
示例运行会写入真实平台数据,应使用专用测试应用/队列。正常结束保留历史和审计;重复演示通常创建新身份,不能当作上次失败操作的恢复。真实业务应在第一次请求前持久化操作身份,网络结果不明时沿原身份核对。
|
||||||
30
examples/recovery/README.md
Normal file
30
examples/recovery/README.md
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# 人工核查与关联重试
|
||||||
|
|
||||||
|
模拟未知效果,凭证据核查为失败,再创建关联的新任务并成功执行。
|
||||||
|
|
||||||
|
## 准备
|
||||||
|
|
||||||
|
- Go 1.27.1、当前版本 Orbit;服务启动和初始化见[仓库 README](../../README.md#快速开始)。
|
||||||
|
- 初始化时增加 --worker-access --recovery-access。
|
||||||
|
- [示例总索引](../README.md)提供统一初始化和权限说明;完整字段、失败处理见[详细手册](../../docs/examples/recovery.md)。
|
||||||
|
|
||||||
|
## 运行
|
||||||
|
|
||||||
|
以下命令从仓库根目录执行;凭据路径替换为实际初始化输出。
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd examples
|
||||||
|
export ORBIT_URL=http://127.0.0.1:8080
|
||||||
|
export ORBIT_CREDENTIALS_FILE="$PWD/../.local/development.credentials.json"
|
||||||
|
go run ./recovery
|
||||||
|
```
|
||||||
|
|
||||||
|
## 结果核对
|
||||||
|
|
||||||
|
source_kind=MANUAL_RETRY;原任务 FAILED、新任务 SUCCEEDED,保留 audit 和 operations。具体 ID 和统计值以本次运行为准。程序会核对上述关键条件,失败时打印错误并以非零状态退出。
|
||||||
|
|
||||||
|
## 接入自己的项目
|
||||||
|
|
||||||
|
阅读[main.go](main.go)中的客户端创建、请求及错误处理。业务项目通过 `go get git.yuntuo.hk/k2safe/orbit/sdk/go@v0.1.1` 引入 SDK,无需导入本示例包。
|
||||||
|
|
||||||
|
示例运行会写入真实平台数据,应使用专用测试应用/队列。正常结束保留历史和审计;重复演示通常创建新身份,不能当作上次失败操作的恢复。真实业务应在第一次请求前持久化操作身份,网络结果不明时沿原身份核对。
|
||||||
30
examples/resources/README.md
Normal file
30
examples/resources/README.md
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# 队列配额与限速
|
||||||
|
|
||||||
|
制造队列积压背压,释放额度后以原身份补交,并验证受控执行。
|
||||||
|
|
||||||
|
## 准备
|
||||||
|
|
||||||
|
- Go 1.27.1、当前版本 Orbit;服务启动和初始化见[仓库 README](../../README.md#快速开始)。
|
||||||
|
- 队列创建/配置权限;初始化时增加 --worker-access。
|
||||||
|
- [示例总索引](../README.md)提供统一初始化和权限说明;完整字段、失败处理见[详细手册](../../docs/api/queues.md)。
|
||||||
|
|
||||||
|
## 运行
|
||||||
|
|
||||||
|
以下命令从仓库根目录执行;凭据路径替换为实际初始化输出。
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd examples
|
||||||
|
export ORBIT_URL=http://127.0.0.1:8080
|
||||||
|
export ORBIT_CREDENTIALS_FILE="$PWD/../.local/development.credentials.json"
|
||||||
|
go run ./resources
|
||||||
|
```
|
||||||
|
|
||||||
|
## 结果核对
|
||||||
|
|
||||||
|
backpressure=QUEUE_FULL http=429;最终 unfinished=0、worker_drained=true。具体 ID 和统计值以本次运行为准。程序会核对上述关键条件,失败时打印错误并以非零状态退出。
|
||||||
|
|
||||||
|
## 接入自己的项目
|
||||||
|
|
||||||
|
阅读[main.go](main.go)中的客户端创建、请求及错误处理。业务项目通过 `go get git.yuntuo.hk/k2safe/orbit/sdk/go@v0.1.1` 引入 SDK,无需导入本示例包。
|
||||||
|
|
||||||
|
示例运行会写入真实平台数据,应使用专用测试应用/队列。正常结束保留历史和审计;重复演示通常创建新身份,不能当作上次失败操作的恢复。真实业务应在第一次请求前持久化操作身份,网络结果不明时沿原身份核对。
|
||||||
@@ -4,12 +4,15 @@
|
|||||||
|
|
||||||
完整前置、调用、输出、故障处理与事务边界见 [运行手册](../../docs/examples/result-inbox.md)。
|
完整前置、调用、输出、故障处理与事务边界见 [运行手册](../../docs/examples/result-inbox.md)。
|
||||||
|
|
||||||
从本目录执行:
|
先按运行手册创建带 `--event-access` 的专用平台凭据及独立空业务库。从仓库根目录执行(DSN 替换为实际配置):
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
|
export ORBIT_URL=http://127.0.0.1:8080
|
||||||
|
export ORBIT_CREDENTIALS_FILE="$PWD/.local/inbox.credentials.json"
|
||||||
|
export ORBIT_RECEIVER_DSN='user:password@tcp(127.0.0.1:3306)/receiver_example'
|
||||||
|
cd examples/result-inbox
|
||||||
GOWORK=off go run ./cmd/receiver init
|
GOWORK=off go run ./cmd/receiver init
|
||||||
GOWORK=off go run ./cmd/receiver demo
|
GOWORK=off go run ./cmd/receiver demo
|
||||||
GOWORK=off go run ./cmd/receiver consume
|
|
||||||
```
|
```
|
||||||
|
|
||||||
- `init`:使用 ORBIT_RECEIVER_DSN 初始化专用空数据库,不自动升级已有表。
|
- `init`:使用 ORBIT_RECEIVER_DSN 初始化专用空数据库,不自动升级已有表。
|
||||||
@@ -19,3 +22,5 @@ GOWORK=off go run ./cmd/receiver consume
|
|||||||
[业务事务](internal/inbox/store.go) 同时写入 [Inbox 与视图](internal/inbox/schema.sql),两张表、17个中文字段注释、零外键。模型见 [model.go](internal/inbox/model.go)。
|
[业务事务](internal/inbox/store.go) 同时写入 [Inbox 与视图](internal/inbox/schema.sql),两张表、17个中文字段注释、零外键。模型见 [model.go](internal/inbox/model.go)。
|
||||||
|
|
||||||
根目录 `make test/vet/build` 包含本模块;`make integration` 创建独立临时数据库,运行数据库、COMMIT响应丢失、真实消费者强杀回归和demo,结束清理自建容器。未设置集成环境时普通go test跳过外部测试,不表示这些故障已经验证。
|
根目录 `make test/vet/build` 包含本模块;`make integration` 创建独立临时数据库,运行数据库、COMMIT响应丢失、真实消费者强杀回归和demo,结束清理自建容器。未设置集成环境时普通go test跳过外部测试,不表示这些故障已经验证。
|
||||||
|
|
||||||
|
预期 demo 输出 `inbox_duplicate=true applied_events=1` 和 `ack_confirmed=1 pending=0`。`init` 仅运行一次;连续消费另行配置持久的 `ORBIT_SUBSCRIPTION_ID`、`RECEIVER_NAME`,再运行 `GOWORK=off go run ./cmd/receiver consume`。完整命令见运行手册;不要用重复运行 demo 替代持续消费。
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ module git.yuntuo.hk/k2safe/orbit/examples/result-inbox
|
|||||||
go 1.27.1
|
go 1.27.1
|
||||||
|
|
||||||
require (
|
require (
|
||||||
git.yuntuo.hk/k2safe/orbit/sdk/go v0.0.0
|
git.yuntuo.hk/k2safe/orbit/sdk/go v0.1.0
|
||||||
github.com/go-sql-driver/mysql v1.10.1
|
github.com/go-sql-driver/mysql v1.10.1
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
30
examples/retry/README.md
Normal file
30
examples/retry/README.md
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# 有限安全重试
|
||||||
|
|
||||||
|
第一次明确失败且未产生效果,退避后第二次成功。
|
||||||
|
|
||||||
|
## 准备
|
||||||
|
|
||||||
|
- Go 1.27.1、当前版本 Orbit;服务启动和初始化见[仓库 README](../../README.md#快速开始)。
|
||||||
|
- 初始化时增加 --worker-access。
|
||||||
|
- [示例总索引](../README.md)提供统一初始化和权限说明;完整字段、失败处理见[详细手册](../../docs/api/retries.md)。
|
||||||
|
|
||||||
|
## 运行
|
||||||
|
|
||||||
|
以下命令从仓库根目录执行;凭据路径替换为实际初始化输出。
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd examples
|
||||||
|
export ORBIT_URL=http://127.0.0.1:8080
|
||||||
|
export ORBIT_CREDENTIALS_FILE="$PWD/../.local/development.credentials.json"
|
||||||
|
go run ./retry
|
||||||
|
```
|
||||||
|
|
||||||
|
## 结果核对
|
||||||
|
|
||||||
|
attempts=2 first_retryable=true;started=2 confirmed=2 running=0。具体 ID 和统计值以本次运行为准。程序会核对上述关键条件,失败时打印错误并以非零状态退出。
|
||||||
|
|
||||||
|
## 接入自己的项目
|
||||||
|
|
||||||
|
阅读[main.go](main.go)中的客户端创建、请求及错误处理。业务项目通过 `go get git.yuntuo.hk/k2safe/orbit/sdk/go@v0.1.1` 引入 SDK,无需导入本示例包。
|
||||||
|
|
||||||
|
示例运行会写入真实平台数据,应使用专用测试应用/队列。正常结束保留历史和审计;重复演示通常创建新身份,不能当作上次失败操作的恢复。真实业务应在第一次请求前持久化操作身份,网络结果不明时沿原身份核对。
|
||||||
30
examples/schedules/README.md
Normal file
30
examples/schedules/README.md
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# 定时计划
|
||||||
|
|
||||||
|
创建有限周期计划,恢复运行,读取固定版本触发来源,最后暂停并排空。
|
||||||
|
|
||||||
|
## 准备
|
||||||
|
|
||||||
|
- Go 1.27.1、当前版本 Orbit;服务启动和初始化见[仓库 README](../../README.md#快速开始)。
|
||||||
|
- 初始化时增加 --worker-access --schedule-access。
|
||||||
|
- [示例总索引](../README.md)提供统一初始化和权限说明;完整字段、失败处理见[详细手册](../../docs/api/schedules.md)。
|
||||||
|
|
||||||
|
## 运行
|
||||||
|
|
||||||
|
以下命令从仓库根目录执行;凭据路径替换为实际初始化输出。
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd examples
|
||||||
|
export ORBIT_URL=http://127.0.0.1:8080
|
||||||
|
export ORBIT_CREDENTIALS_FILE="$PWD/../.local/development.credentials.json"
|
||||||
|
go run ./schedules
|
||||||
|
```
|
||||||
|
|
||||||
|
## 结果核对
|
||||||
|
|
||||||
|
source_kind=SCHEDULE;paused=true;completed_tasks 至少为 2;running=0。具体 ID 和统计值以本次运行为准。程序会核对上述关键条件,失败时打印错误并以非零状态退出。
|
||||||
|
|
||||||
|
## 接入自己的项目
|
||||||
|
|
||||||
|
阅读[main.go](main.go)中的客户端创建、请求及错误处理。业务项目通过 `go get git.yuntuo.hk/k2safe/orbit/sdk/go@v0.1.1` 引入 SDK,无需导入本示例包。
|
||||||
|
|
||||||
|
示例运行会写入真实平台数据,应使用专用测试应用/队列。正常结束保留历史和审计;重复演示通常创建新身份,不能当作上次失败操作的恢复。真实业务应在第一次请求前持久化操作身份,网络结果不明时沿原身份核对。
|
||||||
32
examples/subscriptions/README.md
Normal file
32
examples/subscriptions/README.md
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# 结果订阅管理
|
||||||
|
|
||||||
|
创建订阅、同键核对、暂停、恢复及查询,最后暂停本次订阅。
|
||||||
|
|
||||||
|
## 准备
|
||||||
|
|
||||||
|
- Go 1.27.1、当前版本 Orbit;服务启动和初始化见[仓库 README](../../README.md#快速开始)。
|
||||||
|
- 初始化时增加 --event-access。
|
||||||
|
- [示例总索引](../README.md)提供统一初始化和权限说明;完整字段、失败处理见[详细手册](../../docs/examples/subscriptions.md)。
|
||||||
|
|
||||||
|
## 运行
|
||||||
|
|
||||||
|
以下命令从仓库根目录执行;凭据路径替换为实际初始化输出。
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd examples
|
||||||
|
export ORBIT_URL=http://127.0.0.1:8080
|
||||||
|
export ORBIT_CREDENTIALS_FILE="$PWD/../.local/development.credentials.json"
|
||||||
|
go run ./subscriptions
|
||||||
|
```
|
||||||
|
|
||||||
|
## 结果核对
|
||||||
|
|
||||||
|
duplicate=true resumed_revision=3;final_enabled=false revision=4 pending=0。具体 ID 和统计值以本次运行为准。程序会核对上述关键条件,失败时打印错误并以非零状态退出。
|
||||||
|
|
||||||
|
## 接入自己的项目
|
||||||
|
|
||||||
|
阅读[main.go](main.go)中的客户端创建、请求及错误处理。业务项目通过 `go get git.yuntuo.hk/k2safe/orbit/sdk/go@v0.1.1` 引入 SDK,无需导入本示例包。
|
||||||
|
|
||||||
|
示例运行会写入真实平台数据,应使用专用测试应用/队列。正常结束保留历史和审计;重复演示通常创建新身份,不能当作上次失败操作的恢复。真实业务应在第一次请求前持久化操作身份,网络结果不明时沿原身份核对。
|
||||||
|
|
||||||
|
每次演示保留一个暂停订阅,命名空间最多 64 个订阅;不要将重复运行示例作为持续消费者。
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user