feat: add idempotent batch task submission and recovery examples
This commit is contained in:
@@ -130,3 +130,11 @@
|
||||
- 输出:inbox_duplicate=true、applied_events=1、ack_confirmed=1、pending=0。
|
||||
- 覆盖:并发重复、旧版本保护、回滚、真实MySQL COMMIT响应丢失、业务提交后/ACK前消费者SIGKILL及新进程去重。
|
||||
- 边界:只覆盖接收方本地SQL效果;核心SDK不依赖数据库,外部副作用需要接收方自己的幂等/Outbox设计。
|
||||
|
||||
## 已可运行:批量受理与部分补交
|
||||
|
||||
- 源码:[batch](../../sdk/go/examples/batch/main.go),[完整启动命令和输出](batch.md)。
|
||||
- 步骤:独立暂停队列 → 三项批量提交、两项成功一项满额 → 整批核对原回执 → 取消释放额度 → 仅原身份补交第三项 → 取消收尾。
|
||||
- 预期:accepted=2、replayed=2、retried_items=1、unfinished=0。
|
||||
- 异常:逐项区分REJECTED/UNKNOWN/NOT_ATTEMPTED;真实HTTP响应丢失后恢复无重复,保留当前权限和额度控制。
|
||||
- 范围:示例只演示受理,不转换文件、不提供业务Outbox;失败非零退出,每项60秒总时限,保留队列及审计。
|
||||
|
||||
50
docs/examples/batch.md
Normal file
50
docs/examples/batch.md
Normal file
@@ -0,0 +1,50 @@
|
||||
# 批量文件作业受理与部分补交
|
||||
|
||||
[完整源码](../../sdk/go/examples/batch/main.go) 使用独立Go SDK,不导入服务端模型或数据库驱动。它演示受理与取消,不启动Worker或转换真实文件。
|
||||
|
||||
## 前置与运行
|
||||
|
||||
使用已迁移的MySQL和当前服务。开发凭据需要 `queues:manage/read`、`tasks:submit/read/cancel` 和当前命名空间全部队列范围;标准bootstrap默认具备这些权限。只在专用开发命名空间运行。
|
||||
|
||||
仓库根目录中,先通过环境配置专用 `ORBIT_MYSQL_DSN`:
|
||||
|
||||
```sh
|
||||
go run ./cmd/orbit-migrate up
|
||||
mkdir -p .local
|
||||
chmod 700 .local
|
||||
go run ./cmd/orbit-admin bootstrap \
|
||||
--application batch-demo --namespace default --environment development \
|
||||
--queue files --output .local/batch.credentials.json
|
||||
go run ./cmd/orbit
|
||||
```
|
||||
|
||||
另开终端:
|
||||
|
||||
```sh
|
||||
cd sdk/go
|
||||
ORBIT_URL=http://127.0.0.1:8080 \
|
||||
ORBIT_CREDENTIALS_FILE=../../.local/batch.credentials.json \
|
||||
go run ./examples/batch
|
||||
```
|
||||
|
||||
也接受ORBIT_TOKEN,环境值优先。示例自行创建并暂停一个独立队列,未终结上限为2,不改变已有队列或应用配置。前置应用剩余额度至少2。
|
||||
|
||||
## 调用链与输出
|
||||
|
||||
1. 三项文件引用与精确整数输入,使用三个稳定键一次提交。
|
||||
2. 前两项受理,第三项QUEUE_FULL;整批重报确认前两项ID不变且去重。
|
||||
3. 查询并取消第一项释放额度,仅以第三项原键和原参数补交。
|
||||
4. 取消剩余两项,核对unfinished=0,队列保持暂停。
|
||||
|
||||
```text
|
||||
accepted=2 rejected=1 code=QUEUE_FULL
|
||||
replayed=2 same_task_ids=true
|
||||
retried_items=1 same_identity=true accepted=true
|
||||
queue=<实际32位ID> paused=true unfinished=0
|
||||
```
|
||||
|
||||
每项总时限60秒,示例总调用上下文20秒。所有响应都校验,失败非零退出且不打印token或业务参数。网络异常时示例直接报错,不循环生成新身份;真正生产发送器应从业务库恢复原身份再核对。示例每次运行生成独立身份,**不是持久化业务Outbox实现**。
|
||||
|
||||
正常完成保留已取消任务、队列和审计,不硬删除。异常中断可能留下任务;恢复扫描器按总时限处理,示例不能保证强杀后的主动清理。对有外部副作用的真实任务仍需核查执行状态。
|
||||
|
||||
[真实SDK回归](../../sdk/go/batch_integration_test.go) 还通过HTTP代理在服务已返回受理回执后强制断线,再用原身份重报,确认没有重复任务。全部失败分类、部分提交与单项/批量互通见 [接口手册](../api/batch-tasks.md)。
|
||||
Reference in New Issue
Block a user