feat(booking): add safe retries and operational metrics
This commit is contained in:
1 parent
c826b6e574
commit
7330ac853b
26 files changed
+749
-31
No files matched your search
@@ -18,3 +18,16 @@
|
||||
- 本地验证使用 H2,不使用远程数据库默认值。
|
||||
- 远程测试环境只允许通过 Secret 注入连接信息。
|
||||
- 真实邮件样本、密码和 `.planning` 过程文件不进入产品提交。
|
||||
|
||||
## 测试环境部署与回滚 Runbook
|
||||
|
||||
1. 先由数据库管理员完成历史凭据轮换,并在 Secret 系统注入新的 `TH_HOTEL_BOOKING_PG_URL`、`TH_HOTEL_BOOKING_PG_USERNAME`、`TH_HOTEL_BOOKING_PG_PASSWORD`;仓库不保存其值。
|
||||
2. 在应用启动前,以同一 Secret 在受控环境执行 `scripts/verify-booking-postgresql-migration.sh`。脚本必须先完成项目 schema preflight,再串行验证 V1/V2;没有 URL 时会以 exit 64 失败关闭。
|
||||
3. 仅在确认 schema 仅为 `th_hotel_booking` 且 pre/postflight 通过后,设置 `TH_HOTEL_BOOKING_PG_ENABLED=true`。旧 MySQL 仍只读兼容,不允许双写或跨库事务。
|
||||
4. 如需回滚应用行为,先停止 AgentBus 入口/worker,再将 `TH_HOTEL_BOOKING_PG_ENABLED=false` 并重启;不要执行 Flyway clean、不要删除 schema。已保存的 contracts artifact 与 attempt 供排障和三个月 retention 清理使用。
|
||||
5. 排障从受控查询 `GET /api/reservation/booking-processing-runs/{runId}` 开始;只有 `FAILED` run 可调用 `POST /api/reservation/booking-processing-runs/{runId}/retry`。重试只读取已脱敏的 contracts artifact,绝不重拉原件。
|
||||
6. 系统管理员用 `GET /api/reservation/booking-processing-metrics` 观察最近 24 小时的失败、Agent fallback、Risk、积压和重试趋势。该 API 不返回原始邮件、附件、团号或 Secret。
|
||||
|
||||
## 当前外部阻塞
|
||||
|
||||
- 远程 PostgreSQL 测试库在本轮的非写入 JDBC 预检中,于认证/SSL 协商前读取超时;没有执行 SQL、没有创建 schema。待网络或服务端恢复后,按上述 Runbook 的 preflight/migrate/postflight 路径继续,不能以重复重试替代环境修复。
|
||||
@@ -96,6 +96,13 @@ Excel、图片和正文的原始材料体积大、结构多变且含历史内容
|
||||
- 同团同封的 standalone Trace 在信息系统内合并为一张候选卡,保留每条服务项和证据;跨封 Trace 绝不并入旧卡,Context 只以无自由文本的时间序摘要提供历史顺序。
|
||||
- Trace 的最终确认至少选择 `FO` 或 `HSK`,可同时选择二者;本期确认不触发部门流转。
|
||||
|
||||
### 5.4 运行重试与可观测性
|
||||
|
||||
- `FAILED` run 只能从已保存的 `PARSED_FACT_SET`、`CONTEXT_PACKAGE`、`MATERIAL_PACKAGE` 重放;不会重新拉取邮件、附件或历史,也不会创建新的 source revision。重试在 worker 中继续,processing attempt 与 `retry_count` 形成可审计的尝试链。
|
||||
- `FAILED` 之外的状态拒绝重试;旧的确认投影在重试期间不返回,避免用户确认过期候选。
|
||||
- 管理员只读指标固定统计最近 24 小时:失败率、Agent fallback 比率、Risk 比率、活跃积压、已重试 run 与 retry attempt。指标只来自 `th_hotel_booking` 聚合,不含个人数据、邮件内容、附件、团号或跨库查询。
|
||||
- 任何监控、重试或 retention 任务都以用户确认前为终点,不能触发 PMS/Opera、付款、库存扣减或部门流转。
|
||||
|
||||
## 6. 数据与事实源
|
||||
|
||||
- 新 Booking 主线的事实源是 PostgreSQL schema `th_hotel_booking`。处理运行、版本化契约、证据引用、候选、校验和确认投影均落入该 schema。
|
||||
|
||||
@@ -148,7 +148,7 @@ Validator 必须校验:版本一致性、证据存在、目标解析、字段
|
||||
| `blocked_fields[]` | 缺失/冲突字段及需用户选择的候选;不暴露内部 payload。 |
|
||||
| `linked_actions[]` | 如 Allotment source/actual、Trace 合并关系;只显示本期可确认参数。 |
|
||||
| `safe_evidence[]` | 文件/Sheet/行/图片等安全引用与脱敏摘要。 |
|
||||
| `processing_run` | run ID、当前状态、可重试状态与安全错误摘要。 |
|
||||
| `processing_run` | run ID、当前状态、重试次数、可重试状态与安全错误摘要。 |
|
||||
|
||||
确认 API 只冻结用户确认的参数和审计,必须携带 `processing_run_id` 与并发版本。确认成功不调用 PMS/Opera,也不执行付款、库存扣减或部门流转。
|
||||
|
||||
@@ -156,9 +156,10 @@ Validator 必须校验:版本一致性、证据存在、目标解析、字段
|
||||
|
||||
1. AgentBus 与手工 EML 都调用同一个 `BookingMessageOrchestrator`,并产生一致的 `SourceMessageEnvelope` 幂等语义。
|
||||
2. 同步完成且无需异步 Agent 时返回 `201`;进入 Agent 或异步处理时返回 `202` 与 `processing_run_id`。
|
||||
3. 状态查询为 `GET /api/reservation/booking-processing-runs/{runId}`;已有 `POST /api/reservation/booking-email-intakes` 逐步适配为统一入口。
|
||||
3. 状态查询为 `GET /api/reservation/booking-processing-runs/{runId}`;已有 `POST /api/reservation/booking-email-intakes` 逐步适配为统一入口。仅 `FAILED` run 可经 `POST /api/reservation/booking-processing-runs/{runId}/retry` 以 `202` 重放;它只能重用已持久化的脱敏 contracts artifact,新增 processing attempt,不重新下载邮件/附件、不创建 revision、更不调用 PMS/Opera。
|
||||
4. PostgreSQL `th_hotel_booking` 保存 run、attempt、版本、证据引用、候选、校验和确认投影;`PARSED_FACT_SET` 中只允许保存受 policy 约束的 Agent 摘要,所有这些项目 schema 数据按 `retention_until` 三个月清理。旧 MySQL 只能被 Context 兼容读取,不能参与新主线写入或跨库事务。
|
||||
5. 所有持久化/接口代码必须使用 `contract_version` 做版本门禁;未知未来版本 fail closed 并形成安全 Risk/技术错误记录。
|
||||
6. 仅拥有 `SYSTEM_ADMIN_CONSOLE_ACCESS` 的用户可读取 `GET /api/reservation/booking-processing-metrics`。该接口固定返回最近 24 小时的总 run、失败率、Agent fallback 比率、Risk 比率、积压、已重试 run 与 retry attempt 聚合,不返回任何邮件、附件、团号或用户信息。
|
||||
|
||||
## 10. 兼容与测试要求
|
||||
|
||||
|
||||
Reference in new issue
Block a user