From dab364664ed4d1aa7605de1a0c1a02299df75941 Mon Sep 17 00:00:00 2001 From: ila <2+ila@noreply.git.ilapage.cn> Date: Wed, 12 Aug 2026 18:17:11 +0800 Subject: [PATCH] docs: create Bell task #17 acceptance archive --- ...5%E5%B9%82%E7%AD%89%E6%94%B6%E6%8D%AE.-.md | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 Task-17-Bell%E4%B8%8D%E5%8F%AF%E5%8F%98Event%E4%B8%8E%E6%B0%B8%E4%B9%85%E5%B9%82%E7%AD%89%E6%94%B6%E6%8D%AE.-.md diff --git a/Task-17-Bell%E4%B8%8D%E5%8F%AF%E5%8F%98Event%E4%B8%8E%E6%B0%B8%E4%B9%85%E5%B9%82%E7%AD%89%E6%94%B6%E6%8D%AE.-.md b/Task-17-Bell%E4%B8%8D%E5%8F%AF%E5%8F%98Event%E4%B8%8E%E6%B0%B8%E4%B9%85%E5%B9%82%E7%AD%89%E6%94%B6%E6%8D%AE.-.md new file mode 100644 index 0000000..d028d71 --- /dev/null +++ b/Task-17-Bell%E4%B8%8D%E5%8F%AF%E5%8F%98Event%E4%B8%8E%E6%B0%B8%E4%B9%85%E5%B9%82%E7%AD%89%E6%94%B6%E6%8D%AE.-.md @@ -0,0 +1,44 @@ +# 17 Bell不可变Event与永久幂等收据 + +- 类型:需求 +- 所属 Epic:#7 +- 所属 MVP / 版本:#8 +- 状态:待验收 +- 日期:2026-08-12 +- Gitea 工单:https://git.ilapage.cn/ila/yovision/issues/17 +- Wiki 页面:Task-17-Bell不可变Event与永久幂等收据 +- Wiki revision:见本地镜像头 + +## 背景与目标 + +可靠接收外部事件,在重试、并发和重启后保持永久幂等,同时禁止改写原始 Event。 + +## 最终方案 + +以 `(producer_id, source_event_id)` 唯一键和 payload hash 建立稳定 Receipt;相同正文返回原结果,不同正文返回冲突。Event/Receipt 持久化在同一事务,数据库触发器拒绝 Event 更新或删除,并提供游标分页与详情查询。 + +## 修改文件 + +- `Bell/server/app/event/`、`receipt/`:入站服务、HTTP、查询和类型。 +- `Bell/server/migrations/2026081202_event_receipt.sql`:不可变表、索引、Receipt 和触发器。 +- `Bell/web/src/views/event/Events.vue`:事件查询与技术详情。 + +## 验收结果 + +| 验收标准 | 结果 | +|---|---| +| 并发重复返回同一 Event/Receipt | 通过 | +| 同键不同 payload 返回冲突 | 通过 | +| 进程/连接重建后仍幂等 | 通过 | +| Event 数据库层不可变 | 通过 | +| 下游失败时不留下半成品 | 通过 | + +## 测试 + +- 执行:PostgreSQL 集成测试,16 个并发相同入站、冲突、连接池重建、不可变触发器、事务 hook 回滚。 +- 结果:全部通过。 +- **未验证部分**:正式跨项目契约、生产规模压测与生产备份恢复。 + +## 相关提交 + +- `64a1d82` 不可变 Event 与永久幂等 Receipt(PR #35)。