All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 8m25s
31 lines
1.6 KiB
Markdown
31 lines
1.6 KiB
Markdown
## Context
|
||
|
||
公共 Outbox 的 `event_id` 与 `parent_event_id` 上限均为 64 字符。业务观测已有一个稳定 SHA-256 摘要实现,但停复机、网络和流量路径仍直接拼接 UUID 或 Integration ID;Repository 也未提前执行长度校验。
|
||
|
||
## Goals / Non-Goals
|
||
|
||
**Goals:**
|
||
|
||
- 复用单一、稳定的事件 ID 压缩规则覆盖四条风险路径。
|
||
- 在公共持久化边界报告长度契约违规。
|
||
|
||
**Non-Goals:**
|
||
|
||
- 不扩大数据库字段,不修改既有事件,不改变 API 或异步载荷结构。
|
||
- 不重构其他 Outbox 生产者。
|
||
|
||
## Decisions
|
||
|
||
1. 在公共 Outbox 包提供最小稳定 ID 函数:原值未超限时原样返回,超限时保留短业务前缀并拼接 SHA-256 十六进制摘要至恰好不超过 64 字符。相比扩大 Schema,此方案保持既有契约;相比各调用点手写截断,可避免碰撞风险和重复实现。
|
||
2. 四条已确认风险路径在构造业务事实时调用同一函数,使事件载荷内 `event_id` 与信封一致,保持幂等消费校验。
|
||
3. Repository 在 GORM Create 前校验 `EventID`、`ParentEventID` 长度。该防线仅返回明确错误,不自动改写未知生产者的标识语义。
|
||
|
||
## Risks / Trade-offs
|
||
|
||
- [摘要后的 ID 可读性降低] → 保留业务前缀,完整业务定位仍在聚合、资源和载荷字段中。
|
||
- [历史超长请求的重试 ID 发生变化] → 历史写入已整体回滚,不存在需兼容的 Outbox 事实。
|
||
|
||
## Migration Plan
|
||
|
||
部署代码后用 UUID 和 20 位主键验证四条构造路径及 Repository 边界,再执行现有构建与 OpenSpec 校验。回滚仅需恢复代码;无 Schema 与数据迁移。
|