feat: add durable business task outbox example and fault recovery

This commit is contained in:
2026-09-17 23:13:48 +08:00
parent 2b8213a4f7
commit 522fe2ef3e
27 changed files with 2195 additions and 7 deletions

View File

@@ -0,0 +1,33 @@
package outbox
import "time"
// Record 是业务数据库中的待发命令;只确认平台受理,不能表示业务执行成功。
type Record struct {
NamespaceID string // NamespaceID 固定目标命名空间,换凭据不能改变归属。
QueueID string // QueueID 固定目标队列,发送前通过当前凭据核对归属。
OperationID string // OperationID 调用方持久化的业务操作ID,同命名空间内唯一。
IdempotencyKey string // IdempotencyKey 由操作ID派生的固定提交键,重报禁止换键。
RequestJSON []byte // RequestJSON 冻结的任务提交正文,保留数字精度,不含凭据。
RequestDigest []byte // RequestDigest 冻结正文的SHA256,发送前重新校验,非平台语义摘要。
State string // State PENDING待发、SENDING领取中、ACCEPTED已受理、REVIEW需核查。
SendCount uint32 // SendCount 持久化领取次数,包含领取后未发HTTP即退出的次数,上限100。
LeaseEpoch uint64 // LeaseEpoch 每次领取递增;旧代次不能更新新代次的本地结果。
WakeAt *time.Time // WakeAt PENDING的下次领取时间或SENDING的租约期限;终结状态为空,UTC微秒。
SendDeadlineAt time.Time // SendDeadlineAt 首次入库后24小时停止新发送,短于平台90天幂等窗口。
LastCode string // LastCode 最近一次稳定分类,不保存HTTP错误正文、凭据或业务秘密。
TaskID *string // TaskID 仅ACCEPTED记录平台任务ID,其余状态为空。
ReceiptJSON []byte // ReceiptJSON 仅ACCEPTED保存原受理回执;不是当前执行状态。
CreatedAt time.Time // CreatedAt 业务事务首次提交命令的UTC时间,微秒精度。
UpdatedAt time.Time // UpdatedAt 最近状态变化的UTC时间,不能替代租约代次。
}
// Job 演示接入方业务记录,与Record原子创建,受理确认时再原子关联任务。
type Job struct {
NamespaceID string // NamespaceID 与待发命令使用相同命名空间范围。
OperationID string // OperationID 业务操作标识,与同事务Outbox一一对应。
SourceRef string // SourceRef 待处理对象引用,不含对象正文;首次创建后固定。
TaskID *string // TaskID 已确认的平台受理ID;为空不证明平台尚未受理。
CreatedAt time.Time // CreatedAt 业务记录首次创建UTC时间,微秒精度。
UpdatedAt time.Time // UpdatedAt 关联平台任务时的UTC时间,微秒精度。
}