Files
junhong_cmp_fiber/.scratch/ur37-wecom-approval-foundation/issues/08-polling-compensation-and-terminal-event.md
2026-07-22 16:58:26 +09:00

2.0 KiB
Raw Blame History

08 — 完成轮询补偿与终态只发布一次

What to build: 系统可以每两分钟并发安全地领取最久未同步的审批实例并查询企微权威详情;无论回调、轮询或重复任务谁先到,审批首次进入终态时都只发布一次对应业务终态事件,并对撤销、删除和通过后撤销保留明确异常语义。

Blocked by:

  • 07 — 接入加密回调与权威详情同步
  • .scratch/tech-public-foundation/issues/03-outbox-at-least-once-delivery.md — 03 — 完成 Outbox 到 Asynq 的至少一次投递闭环

Status: ready-for-agent

架构通道: 复杂写 Application + Domain轮询调度和领取为辅助 Infrastructure。

完整业务边界: 本票收口轮询资格、并发领取、审批终态状态机及事务内业务事件发布。明确不实现退款退款、充值入账或其他下游消费者,不把审批通过等同于业务处理成功。

  • 轮询默认每两分钟扫描提交中、审批中和需要恢复同步的实例,单批最多 100 条,按最久未轮询优先并以稳定主键打破并列。
  • 多实例通过轮询租约或条件领取避免同一时刻重复占用;详情失败记录安全摘要并重新安排,进程中断后过期租约可恢复。
  • 回调、轮询和手动同步复用同一状态同步用例,审批中、通过、驳回、撤销、通过后撤销、删除及提交异常均遵守公共状态机。
  • 首次进入终态时在保存审批状态的同一 PostgreSQL 事务写稳定业务终态 Outbox状态未变化、重复终态或乐观锁冲突重试不会产生第二个事件。
  • 审批状态与 business_process_result/business_processed_at 独立;通过后撤销在业务未执行时阻断后续处理,已执行时不自动冲正并产生 critical Audit Event 与告警事件。
  • 测试覆盖轮询资格、批量上限、稳定排序、多实例领取、回调与轮询并发、重复终态、乱序状态、乐观锁冲突、撤销异常和每个业务终态最多一个 Outbox。