Files
lingniu-vehicle-ingest/vehicle-data-platform/docs/design/notification-idempotent-retry-audit-20260723

通知失败幂等重试审计

日期2026-07-23
范围:事件中心 → 通知记录 → 失败送达详情与人工重试

健康度

已从“失败只读诊断、外部渠道不可见”提升为可审计的受控恢复链路。核心权限、幂等、尝试上限、客户车辆范围与真假送达语义均有服务端约束。外部渠道的真实服务商投递仍由仓库之外的发送工作进程负责,因此本轮只承诺重新入队,不承诺已经送达。

发现与修复

  1. 生产查询原先固定筛选 in_app,短信、邮件和企业通讯失败无法进入通知中心;现在返回全部渠道,并支持按送达状态、阅读状态和关键字做完整范围筛选、分页与总数统计。
  2. 站内通知原先长期停留在 created,前端只能显示“发送中”;现在持久化写入即形成 sent 证据,外部渠道继续保持真实的 reserved / failed / sent 状态。
  3. 数据表原先缺少尝试次数、服务商消息 ID、失败原因、最近尝试与重试操作者迁移 034_alert_notification_retry.sql 补齐送达元数据和不可变重试审计。
  4. 新增失败通知安全重试:需要当前尝试序号、原因与幂等键,最多三次;相同幂等键只返回原回执,不重复入队。
  5. 重试权限仅开放给管理员和操作员;客户通知查询和已读写入均按授权 VIN 隔离。阅读状态只属于站内信,外部渠道明确显示“不适用”。
  6. 详情侧栏新增服务商证据、尝试次数、恢复提示、送达时间线和最近 20 条重试审计;确认窗在写入前展示渠道、收件人、尝试变化和不可提前标记成功的边界。
  7. 桌面侧栏初次视觉复核发现恢复卡的文案被三枚操作按钮挤成窄列,已改为“证据说明 + 独立操作行”,移动端使用 42px 以上操作目标并保持单列滚动。

证据

  • 改造前,失败筛选没有可见记录:01-before-failed-notification-empty.png
  • 桌面失败详情与修正后的恢复操作:02-after-failed-notification-detail-desktop.png
  • 桌面安全重试确认:03-after-retry-confirmation-desktop.png
  • 390 × 844 移动端详情与恢复操作:04-after-failed-notification-mobile.png

验证

  • go test ./...:通过
  • Web 正式套件78 个测试文件、518 项测试通过
  • 事件中心专项45 项测试通过
  • 生产构建Web、开放门户与 Go 二进制全部通过
  • 真实浏览器1440 × 900 与 390 × 844确认窗只做视觉检查没有提交真实重试

无障碍与限制

  • 失败详情、恢复区域、审计区和确认窗具有明确 landmark、可访问名称与状态提示主要动作均可由键盘聚焦提交按钮会在原因不足时禁用。
  • 移动端底部导航与详情固定说明之间没有横向溢出,长内容保持单一侧栏滚动。
  • 本轮未执行屏幕阅读器人工走查,也未覆盖第三方短信、邮件或企业通讯服务商的生产凭据、限流、死信与回调;这些仍需在真实发送工作进程中验证。