feat: add reliable event consumer SDK and process recovery tests

This commit is contained in:
2026-09-17 20:22:41 +08:00
parent 8485a662b2
commit b17d9b1977
25 changed files with 2170 additions and 28 deletions

View File

@@ -0,0 +1,30 @@
# 结果消费协议示例
[完整代码](../../sdk/go/examples/event-protocol/main.go) 使用正式 Go SDK 创建取消结果订阅,提交并取消一个待执行任务,接收并验证冻结结果,然后 ACK;关闭连接后在新连接中重报原证明,验证原确认时间和去重回执,最后暂停本次订阅。
本例只读取并验证结果,没有业务数据库写入。生产业务应使用 [自动消费器及事务去重约定](../sdk/event-consumer.md)。持久化 Inbox 完整示例尚待交付。
## 启动
先按 [订阅管理示例](subscriptions.md) 建立隔离示例队列和带 --event-access 的凭据,启动 Orbit。凭据需要 tasks:submit、tasks:cancel、events:manage/read/consume 及该队列范围;订阅绑定创建凭据,不能临时换凭据消费。
从 sdk/go 目录运行:
```sh
ORBIT_URL=http://127.0.0.1:8080 \
ORBIT_CREDENTIALS_FILE=../../.local/event.credentials.json \
go run ./examples/event-protocol
```
也可以传 ORBIT_TOKEN 与 ORBIT_QUEUE_ID,环境变量覆盖凭据文件对应值。每次运行新建随机订阅及任务身份,全部流程最多 15 秒。本例是短流程,两个连接均短于一次心跳周期;长期运行必须用自动消费器或主动 Ping。
## 输出与核对
```text
event=<本次事件ID> task=<本次任务ID> state=CANCELLED
ack_replayed=true same_receipt=true pending=0 subscription_enabled=false
```
该输出验证的是事件快照和平台 ACK 去重,不表示业务副作用获得恰好一次保证。任何请求失败、收到非本次任务的事件或确认时间不一致,都非零退出;保留已生成的状态供核查。
需要独立示例队列,避免其他程序同时产生取消结果。正常结束暂停本次订阅,保留任务、交付和审计;不删除历史。每个命名空间最多 64 个订阅,重复演示应使用独立测试环境。`make integration` 在一次性 MySQL 和真实进程上实际执行本例。