Files
junhong_cmp_fiber/openspec/changes/bound-outbox-event-identifiers/design.md
break 7aa03e91fb
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 8m25s
修复
2026-08-07 18:00:15 +08:00

1.6 KiB
Raw Blame History

Context

公共 Outbox 的 event_idparent_event_id 上限均为 64 字符。业务观测已有一个稳定 SHA-256 摘要实现,但停复机、网络和流量路径仍直接拼接 UUID 或 Integration IDRepository 也未提前执行长度校验。

Goals / Non-Goals

Goals:

  • 复用单一、稳定的事件 ID 压缩规则覆盖四条风险路径。
  • 在公共持久化边界报告长度契约违规。

Non-Goals:

  • 不扩大数据库字段,不修改既有事件,不改变 API 或异步载荷结构。
  • 不重构其他 Outbox 生产者。

Decisions

  1. 在公共 Outbox 包提供最小稳定 ID 函数:原值未超限时原样返回,超限时保留短业务前缀并拼接 SHA-256 十六进制摘要至恰好不超过 64 字符。相比扩大 Schema此方案保持既有契约相比各调用点手写截断可避免碰撞风险和重复实现。
  2. 四条已确认风险路径在构造业务事实时调用同一函数,使事件载荷内 event_id 与信封一致,保持幂等消费校验。
  3. Repository 在 GORM Create 前校验 EventIDParentEventID 长度。该防线仅返回明确错误,不自动改写未知生产者的标识语义。

Risks / Trade-offs

  • [摘要后的 ID 可读性降低] → 保留业务前缀,完整业务定位仍在聚合、资源和载荷字段中。
  • [历史超长请求的重试 ID 发生变化] → 历史写入已整体回滚,不存在需兼容的 Outbox 事实。

Migration Plan

部署代码后用 UUID 和 20 位主键验证四条构造路径及 Repository 边界,再执行现有构建与 OpenSpec 校验。回滚仅需恢复代码;无 Schema 与数据迁移。