chore: sync production runtime and docs
This commit is contained in:
@@ -0,0 +1,388 @@
|
||||
# 多引擎生产结果管理与路径设计
|
||||
|
||||
更新日期:2026-04-24
|
||||
|
||||
## 1. 目标
|
||||
|
||||
本设计解决三个长期问题:
|
||||
|
||||
- 让 `ENVI / SARscape`、`ISCE2`、后续 `Gamma` 的原生输出可以共存,但系统只消费统一结果包。
|
||||
- 让生产、发布、catalog、数据库自维护、运维自检都围绕同一套受管理目录工作。
|
||||
- 让同一对影像可以保留多引擎、多 profile、多次重跑结果,而不会互相覆盖。
|
||||
|
||||
本设计不是要求所有引擎输出长得一样,而是要求系统托管的结果目录、指针、manifest 和数据库语义一致。
|
||||
|
||||
## 2. 核心原则
|
||||
|
||||
- 结果管理以“标准包”为中心,不以某个引擎的原生目录命名为中心。
|
||||
- 原生输出和系统发布资产必须分层,不能混在一起。
|
||||
- `pair_key` 或 `stack_key` 是业务稳定主键,`run_key` 或 `run_id` 是一次具体生产实例。
|
||||
- catalog 只扫描受管理发布根中的 `manifest.json`,不再把“历史扫描目录”和“正式生产目录”混用。
|
||||
- `current` 指针只在“验收通过并成功发布”后更新。
|
||||
- “只跑未完成”只看当前引擎和当前 profile 对应的 `current` 指针,不看裸目录是否存在。
|
||||
|
||||
## 3. 根路径设计
|
||||
|
||||
系统只保留一套正式受管理结果根:
|
||||
|
||||
```text
|
||||
D:\production_results\
|
||||
dinsar\
|
||||
timeseries\
|
||||
_quarantine\
|
||||
```
|
||||
|
||||
环境变量语义固定为:
|
||||
|
||||
- `RESULT_PUBLISH_ROOT`
|
||||
结果发布总根,默认 `D:\production_results`
|
||||
- `DINSAR_PRODUCT_DIR`
|
||||
D-InSAR 正式发布根,默认 `D:\production_results\dinsar`
|
||||
- `TIMESERIES_PRODUCT_DIR`
|
||||
时序 InSAR 正式发布根,默认 `D:\production_results\timeseries`
|
||||
- `RESULT_QUARANTINE_ROOT`
|
||||
结果隔离区,默认 `D:\production_results\_quarantine`
|
||||
|
||||
以下路径不再视为正式结果根:
|
||||
|
||||
- `MONITOR_DINSAR_DIRS`
|
||||
只保留为历史导入或兼容扫描入口,不再作为新生产的默认落盘位置
|
||||
- `Task_xxx\dinsar_results`
|
||||
只保留迁移期兼容语义,最终退出正式生产链
|
||||
|
||||
## 4. 目录分层
|
||||
|
||||
### 4.1 D-InSAR
|
||||
|
||||
```text
|
||||
D:\production_results\dinsar\<pair_key>\
|
||||
current\
|
||||
current.json
|
||||
sarscape__custom6.json
|
||||
isce2__lt1_dinsar_production_v1.json
|
||||
gamma__lt1_gamma_dinsar_v1.json
|
||||
runs\
|
||||
<run_key>\
|
||||
execution_manifest.json
|
||||
manifest.json
|
||||
native\
|
||||
...
|
||||
assets\
|
||||
disp\
|
||||
disp.tif
|
||||
coh\
|
||||
coh.tif
|
||||
preview\
|
||||
thumb.webp
|
||||
```
|
||||
|
||||
目录语义:
|
||||
|
||||
- `<pair_key>`
|
||||
同一对影像的稳定业务目录
|
||||
- `runs/<run_key>`
|
||||
一次具体生产
|
||||
- `native/`
|
||||
引擎原生输出,用于追溯、审计、复核,不直接作为系统消费入口
|
||||
- `assets/`
|
||||
系统统一消费的标准资产层
|
||||
- `manifest.json`
|
||||
正式 catalog 入库契约
|
||||
- `execution_manifest.json`
|
||||
生产执行记录
|
||||
- `current/*.json`
|
||||
当前可用结果指针
|
||||
|
||||
### 4.2 时序 InSAR
|
||||
|
||||
```text
|
||||
D:\production_results\timeseries\<stack_key>\
|
||||
current\
|
||||
current.json
|
||||
sbas__v1.json
|
||||
psinsar__v1.json
|
||||
runs\
|
||||
<run_id>\
|
||||
manifest.json
|
||||
native\
|
||||
...
|
||||
assets\
|
||||
...
|
||||
preview\
|
||||
thumb.webp
|
||||
```
|
||||
|
||||
这里沿用同一哲学,只是主键从 `pair_key` 换成 `stack_key`。
|
||||
|
||||
## 5. 指针设计
|
||||
|
||||
### 5.1 引擎级 current 指针
|
||||
|
||||
每个结果根都允许多个指针同时存在:
|
||||
|
||||
- `sarscape__custom6.json`
|
||||
- `isce2__lt1_dinsar_production_v1.json`
|
||||
- `gamma__lt1_gamma_dinsar_v1.json`
|
||||
|
||||
用途:
|
||||
|
||||
- 支持同一对影像保留多引擎结果
|
||||
- 支持前端按引擎切换结果
|
||||
- 支持“只跑未完成”按引擎和 profile 做跳过判断
|
||||
|
||||
### 5.2 默认 current 指针
|
||||
|
||||
`current.json` 不是必须立即启用。
|
||||
|
||||
建议语义:
|
||||
|
||||
- 只有在系统明确需要“默认展示结果”时才写入
|
||||
- 默认值由人工或策略层决定,而不是由最近一次运行自动覆盖
|
||||
|
||||
## 6. 原生输出与发布资产分层
|
||||
|
||||
这是本轮设计的关键约束。
|
||||
|
||||
### 6.1 原生输出层
|
||||
|
||||
原生输出层由引擎控制,但必须落到受管理 run 目录的 `native/` 下:
|
||||
|
||||
- ENVI / SARscape
|
||||
保留其成熟原生流程,但原生落盘最终收敛到 `native/`
|
||||
- ISCE2
|
||||
`stripmapApp` 原生输出、日志、中间文件全部进入 `native/`
|
||||
- Gamma
|
||||
后续接入时也遵循相同约束
|
||||
|
||||
### 6.2 标准资产层
|
||||
|
||||
系统统一暴露资产层:
|
||||
|
||||
- `assets/disp/disp.tif`
|
||||
- `assets/coh/coh.tif`
|
||||
- `preview/thumb.webp`
|
||||
|
||||
未来允许增加:
|
||||
|
||||
- `assets/conncomp/conncomp.tif`
|
||||
- `assets/debug/...`
|
||||
|
||||
但 catalog 识别仍以标准 `manifest.json` 为准,不直接猜原生文件结构。
|
||||
|
||||
## 7. D-InSAR 生产路径设计
|
||||
|
||||
### 7.1 生产服务拥有 run 根目录
|
||||
|
||||
对任意一个 `pair_key`,生产服务先创建稳定结果根:
|
||||
|
||||
```text
|
||||
<DINSAR_PRODUCT_DIR>\<pair_key>\runs\<run_key>\
|
||||
```
|
||||
|
||||
然后再把引擎执行和打包都约束到这个 run 目录下。
|
||||
|
||||
这意味着:
|
||||
|
||||
- `results_root_dir` 指向 `<DINSAR_PRODUCT_DIR>\<pair_key>`
|
||||
- `execution.output_dir` 指向 `<DINSAR_PRODUCT_DIR>\<pair_key>\runs\<run_key>`
|
||||
- 原生输出默认进入 `<run_dir>\native`
|
||||
|
||||
### 7.2 ISCE2 的路径设计
|
||||
|
||||
对正式生产链,`ISCE2_OUTPUT_ROOT` 不再承担“正式发布根”的职责。
|
||||
|
||||
建议语义调整为:
|
||||
|
||||
- `ISCE2_WORK_ROOT`
|
||||
仅用于调试、缓存、临时工作空间,或 standalone 调试运行
|
||||
- 正式生产时,由编排层直接下发 `<run_dir>\native` 作为原生输出目录
|
||||
- `ISCE2_OUTPUT_ROOT`
|
||||
只保留 fallback 含义,不再默认等于 `DINSAR_PRODUCT_DIR`
|
||||
|
||||
### 7.3 ENVI 的路径设计
|
||||
|
||||
ENVI 当前仍可能写入 `Task_xxx\dinsar_results`。迁移完成后应统一为:
|
||||
|
||||
- 原生结果写入 `<run_dir>\native`
|
||||
- 标准资产与 manifest 写入 `<run_dir>`
|
||||
|
||||
迁移期允许 packager 从历史目录导入,但这只是兼容,不再作为正式目标结构。
|
||||
|
||||
## 8. ISCE2 D-InSAR 生产设计约束
|
||||
|
||||
### 8.1 生产 profile
|
||||
|
||||
建议正式生产 profile 收敛为:
|
||||
|
||||
- `lt1_dinsar_production_v1`
|
||||
|
||||
不再为 ISCE2 复制 ENVI 的 `metatask/custom6` 形态。ISCE2 自己已经是成熟 orchestrator,项目层不应再人为拆成外部 6 步工作流。
|
||||
|
||||
### 8.2 流程边界
|
||||
|
||||
正式流程分四层:
|
||||
|
||||
1. `preflight`
|
||||
2. `native_isce2`
|
||||
3. `postprocess`
|
||||
4. `acceptance_publish`
|
||||
|
||||
其中:
|
||||
|
||||
- `preflight`
|
||||
负责解析主从影像、DEM、精轨、bbox、多视参数
|
||||
- `native_isce2`
|
||||
必须是一趟原生 `stripmapApp` 跑通到 geocode
|
||||
- `postprocess`
|
||||
负责位移导出、质量掩膜、稳定点精化、标准资产生成
|
||||
- `acceptance_publish`
|
||||
负责写 manifest、更新 current 指针、交给 catalog
|
||||
|
||||
### 8.3 参数设计
|
||||
|
||||
ISCE2 应继承 ENVI 已经验证过的工程经验,而不是机械复制 ENVI 步骤。
|
||||
|
||||
保留或新增的正式生产参数:
|
||||
|
||||
- `force`
|
||||
- `target_grid_size_m`
|
||||
- `bbox`
|
||||
- `bbox_margin`
|
||||
- `orbit_margin_sec`
|
||||
- `coh_threshold`
|
||||
- `unwrap_coh_threshold`
|
||||
- `stable_point_coh_threshold`
|
||||
- `stable_point_count`
|
||||
- `refinement_mode`
|
||||
|
||||
不建议前端暴露的参数:
|
||||
|
||||
- `wavelength`
|
||||
LT1 固定值,只读
|
||||
- `filter_method`
|
||||
v1 固定为工程默认值,不向前端开放高级切换
|
||||
|
||||
### 8.4 ENVI 经验映射
|
||||
|
||||
ENVI 现有工程经验中,值得保留的是:
|
||||
|
||||
- `target_resolution -> looks` 换算逻辑
|
||||
- 基于高相干稳定点的精化思想
|
||||
- 导出后再做稳定性等待与验收
|
||||
|
||||
不应该照搬的是:
|
||||
|
||||
- 把 ISCE2 拆成 ENVI 式的外部 6 步调度
|
||||
- 依赖扫目录“捞”中间文件来续跑
|
||||
|
||||
## 9. Catalog、数据库与自检
|
||||
|
||||
### 9.1 Catalog
|
||||
|
||||
catalog 只扫描:
|
||||
|
||||
- `DINSAR_PRODUCT_DIR`
|
||||
- `TIMESERIES_PRODUCT_DIR`
|
||||
|
||||
并且只认 `manifest.json`。
|
||||
|
||||
`MONITOR_DINSAR_DIRS` 不再参与正式 catalog rebuild,只保留外部导入用途。
|
||||
|
||||
### 9.2 数据库
|
||||
|
||||
现有数据库设计可以继续使用,不需要推倒重建:
|
||||
|
||||
- `result_products`
|
||||
- `result_assets`
|
||||
- `result_issues`
|
||||
- `result_catalog_states`
|
||||
- `dinsar_production_runs`
|
||||
- `dinsar_production_run_items`
|
||||
- `dinsar_production_executions`
|
||||
|
||||
约束:
|
||||
|
||||
- `results_root_dir` 继续指向 `<pair_key>` 根目录
|
||||
- `publish_root_dir` 继续指向 `DINSAR_PRODUCT_DIR`
|
||||
- `native_output_dir` 由 manifest 持久化
|
||||
- 启动自维护仍采用“增量补列,不破坏现有数据”的方式
|
||||
|
||||
### 9.3 运维自检
|
||||
|
||||
运维自检继续围绕 `storage_root` 工作,不围绕任务目录工作。
|
||||
|
||||
重点检查三层:
|
||||
|
||||
- 结果发布根是否存在
|
||||
- catalog 状态是否健康
|
||||
- manifest 数、数据库记录数、needs_rebuild 是否一致
|
||||
|
||||
后续再加两项专项检查:
|
||||
|
||||
- `product_packages`
|
||||
检查 manifest 契约和资产完整性
|
||||
- `wsl_runtime`
|
||||
检查 WSL shared runtime、Python、ISCE2/Gamma 入口一致性
|
||||
|
||||
## 10. 迁移顺序
|
||||
|
||||
### Phase 1
|
||||
|
||||
- 固化本设计
|
||||
- 不打断当前正在运行的 ENVI 生产
|
||||
- 仅允许文档、审计、只读检查
|
||||
|
||||
### Phase 2
|
||||
|
||||
- D-InSAR run 目录强制收敛到 `<pair_key>\runs\<run_key>`
|
||||
- 把引擎原生输出收敛到 `native/`
|
||||
- packager 只在 run 目录内生成标准资产和 manifest
|
||||
- current 指针更新改为“验收通过后再写”
|
||||
|
||||
### Phase 3
|
||||
|
||||
- ISCE2 正式 profile 切换到 `lt1_dinsar_production_v1`
|
||||
- 停止 synthetic resume 方案
|
||||
- 增加 preflight、稳定点精化、结果验收
|
||||
|
||||
### Phase 4
|
||||
|
||||
- ENVI 生产链迁移到同一结果结构
|
||||
- legacy `Task_xxx\dinsar_results` 退出正式生产路径
|
||||
|
||||
### Phase 5
|
||||
|
||||
- catalog rebuild
|
||||
- compat 视图同步
|
||||
- 运维自检补齐结果包专项检查
|
||||
|
||||
## 11. 当前执行约束
|
||||
|
||||
当前如果 ENVI 仍在生产中,以下修改必须等待生产结束后再做:
|
||||
|
||||
- 修改 `ISCE2_OUTPUT_ROOT` 默认语义
|
||||
- 修改 D-InSAR 生产 run 目录结构
|
||||
- 修改 current 指针判定逻辑
|
||||
- 修改 packager 输入路径和 in-place 规则
|
||||
- 修改 catalog rebuild 入口和默认扫描路径
|
||||
- 修改 ENVI 正式落盘位置
|
||||
|
||||
当前可以立即做的事情:
|
||||
|
||||
- 文档固化
|
||||
- 代码审计
|
||||
- 只读自检
|
||||
- 改造计划维护
|
||||
|
||||
原因很简单:本轮改造会动到结果路径、发布契约、跳过判定和指针语义。生产进行中切这些逻辑,风险不是“某个功能出错”,而是直接污染正在生成的结果根。
|
||||
|
||||
## 12. 结论
|
||||
|
||||
健康的方案不是让所有引擎“输出一样”,而是让系统消费的“受管理结果结构”一样。
|
||||
|
||||
这样之后:
|
||||
|
||||
- ENVI 可以继续保留自己的成熟原生算法链
|
||||
- ISCE2 可以按自己的原生工作流稳定生产
|
||||
- Gamma 接入时不需要再改目录哲学
|
||||
- 数据库自维护、catalog、自检、前端结果工作台都只围绕一套标准结果结构工作
|
||||
Reference in New Issue
Block a user