feat: expose workflow runtime through HTTP and Go SDK

This commit is contained in:
2026-09-18 06:51:08 +08:00
parent af1ae4cb21
commit b9e4191c6b
50 changed files with 2221 additions and 143 deletions

View File

@@ -6,7 +6,13 @@
- [完整命令和结果](workflow-definition.md)、[SDK源码](../../sdk/go/examples/workflow-definition/main.go)。
- 六类节点的有限结构定义、原键及同版本确认、新版本发布、旧版本读取保持不变。
- 当前只发布定义,实例执行仍在P4–P5开发。
- 本例只发布定义;实际运行见下方流程示例。
## 已可运行:并行作业、定时等待与外部回执
- [完整命令、输入输出与失败处理](workflow.md)、[独立SDK源码](../../sdk/go/examples/workflow/main.go)。
- 两个任务并行处理并汇合,计时等待后接收显式目标代次的信号,再执行后续任务;最终三个任务完成并有界排空。
- 启动及信号原键重复不会建立新的实例或信号。
## 已可运行:业务事务与任务提交Outbox

View File

@@ -1,6 +1,6 @@
# 研发定义与发布流程
本例运行真实HTTP发布与读取,验证六种节点的格式以及不可变版本。当前不创建流程实例、不执行外部业务。实例运行示例随P4–P5交付。
本例运行真实HTTP发布与读取,验证六种节点的格式以及不可变版本。当前不创建流程实例、不执行外部业务。实际运行另见[并行作业与回执示例](workflow.md)。
源码:[workflow-definition/main.go](../../sdk/go/examples/workflow-definition/main.go)。接口:[定义发布](../api/workflow-definitions.md);字段规范:[结构版本1](../api/workflow-definition-format.md)。

57
docs/examples/workflow.md Normal file
View File

@@ -0,0 +1,57 @@
# 并行生成结果 → 等待外部回执 → 后续任务
[完整源码](../../sdk/go/examples/workflow/main.go)通过独立Go SDK发布固定版本、启动实例,并使用真实自动Worker处理任务。流程是两个文本规范化任务并行完成并汇合,等待500毫秒,等待模拟外部确认信号,最后用左侧输出执行发布步骤。输入为 `{"text":" hello orbit "}`,输出为 `{"text":"HELLO ORBIT"}`。
## 1. 启动
环境:Go 1.27.1、MySQL 8.4+,已设置专用ORBIT_MYSQL_DSN。仓库根目录执行:
```sh
go run ./cmd/orbit-migrate up
mkdir -p .local
chmod 700 .local
go run ./cmd/orbit-admin bootstrap \
--application workflow-example --namespace default --environment development \
--queue workflows --workflow-access --workflow-run-access \
--workflow-signal-access --worker-access \
--output .local/workflow.credentials.json
go run ./cmd/orbit
```
初始化仅执行一次,文件存在时不会覆盖。重用该凭据运行例子无需重复bootstrap。另开终端,从仓库根目录执行:
```sh
cd sdk/go
ORBIT_URL=http://127.0.0.1:8080 \
ORBIT_CREDENTIALS_FILE=../../.local/workflow.credentials.json \
go run ./examples/workflow
```
生产使用HTTPS/WSS,并为定义发布者、启动者、信号发送者及Worker分别签发所需权限。本示例使用一个专用开发凭据,未申请人工恢复或控制权限。
## 2. 调用链与输出
CreateWorkflowDefinition → PublishWorkflowVersion(v1) → StartWorkflow → 原键再次StartWorkflow → 自动Worker并行执行 → GetWorkflowStep读取当前信号契约与代次 → SendWorkflowSignal → 原键再次发送 → 后继任务完成 → GetWorkflow → Worker有界排空。
预期输出中的ID每次运行不同:
```text
workflow=<32位实例ID> state=SUCCEEDED result={"text":"HELLO ORBIT"} start_deduplicated=true signal_deduplicated=true
worker_drained=true started=3 confirmed=3
```
示例会确认三个任务实际开始、三个结果确认且没有运行中的处理器。信号的target_activation_sequence读取自当前步骤,correlation_key使用等待原关联,不猜测恢复代次;重复键不改变目标。示例模拟已核验外部回执,不调用真实第三方业务系统。实际使用中由独立外部调用者保存证据后发送。
## 3. 失败与恢复
示例最长运行45秒,Worker排空最长5秒。NEEDS_REVIEW、FAILED、CANCELLED或Worker提前退出都会报错,不把受理回执当成业务成功。命令重新运行会生成新的独立示例流程,不属于故障时的原身份核对;生产接入方应在自身事务中保存operationKey及完整命令。
出现网络结果不明时,使用原definition/version/input/business_key和原幂等键重报。暂停不延长原截止;信号受理不表示消费。人工恢复使用[六类恢复命令](../api/workflow-recovery.md),不能用普通任务RetryTask绕过流程门控和预算。
示例成功后保留定义、实例、任务、信号和审计,不硬删除历史。每次运行使用唯一处理器名,避免其他Worker误消费该例子。完整命令、HTTP字段和权限见[实例API](../api/workflows.md)。
## 4. 其他可执行恢复场景
[公共SDK集成测试](../../sdk/go/workflow_instances_integration_test.go)还实际运行:启动响应丢失的原键恢复;暂停/继续、定时等待、信号消费和取消;UNKNOWN执行核查、步骤结论及解除核查;剩余尝试内TASK重试与SIGNAL换代;确认PENDING后沿原查询预算继续。使用`make integration`在一次性环境复现。
历史激活列表、流程来源查询、更多独立业务示例及生产验收仍按[计划](../08-development-plan.md)推进。