소스 검색

docs(kb/93): ADR-16 inc+merge 调度中断恢复(≤2 天逐日/>2 天宽扫+re-seed)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
tianyu.chu 1 주 전
부모
커밋
7a00da62d8
1개의 변경된 파일34개의 추가작업 그리고 0개의 파일을 삭제
  1. 34 0
      kb/93-架构决策.md

+ 34 - 0
kb/93-架构决策.md

@@ -655,3 +655,37 @@
 - **反悔条件**:
   - 迁 Iceberg / Hudi(原生小文件合并)
   - Spark 升 3.x,AQE `coalescePartitions` 可自动合并 shuffle 分区,`DISTRIBUTE BY` 可能不再必要
+
+### ADR-16 inc+merge 模型调度中断恢复:≤2 天逐日重跑,>2 天范围宽扫 + re-seed
+
+- **状态**:已采纳
+
+- **背景**:raw/ods 增量 + ful merge 模型(订单 `card_group_order_info` / 拼团 `card_group_info`)调度中断后的恢复口径。中断天数不同恢复方式不同,明文定策防误操作丢数。(维度全量快照模型不受此约束,见 §注。)
+
+- **决策**:按中断天数分治。
+
+  **≤ 2 天:逐日顺序重跑(自愈)。**
+  - 自愈容忍 = 2 天,锚定设计三重窗:raw 48h 宽窗(ADR-03)+ ods 双源 union(扫 `dt` + `pdt` 两分区)+ ful 保留 2 天(`dt` + `pdt`)。
+  - 按 sched 日序重跑失败实例;工作流"昨日依赖"(DEPENDENT 自依赖 `last1Days`)自动锁死日序,前一天不绿后一天不放行。
+  - merge 链 `ful(dt) = ful(pdt) ANTI inc(dt) + inc(dt)` 的 `pdt` 由前一天重跑产出,齐备。
+  - 结果:日内中间态不可救回(ADR-03 T+1 固有),但最新 ful 分区 = 业务库当前态、完整(可以多不能少)。
+
+  **> 2 天:范围宽扫补 inc + re-seed ful(不能逐日)。**
+  - 逐日窄窗会漏最新态:中断久了记录 `update_time` 漂到后面某天,逐日的 `[D, D+2)` 窄窗扫不到漂走的版本(ADR-11 同理),缺的是整条最新态、不只中间态。
+  - 三步(对齐活动日 re-init 的 dump→rebucket→seed):
+    1. raw 一次性宽窗拉 `[gap_start, today+1)`(或按 id 分段全量),补齐 gap 覆盖;
+    2. ods inc 宽扫 raw、按活动日动态分区归位,补齐 gap 内各 dt 的 inc(每单落其当前活动日);
+    3. ful **用 seed 脚本从 ods inc 全史按 id 取最新重建 `ful(today)`**——不逐日 merge(中间 `pdt` 缺失、链已断)。
+  - 不依赖"猜漂了几天"(ADR-11 宽扫窄落原则)。
+
+- **后果**:
+  - 正面:≤2 天零成本自愈(顺序重跑即可);>2 天路径确定,不猜漂移天数。
+  - 负面:日内中间态一律不可救回(要留需上 CDC,见 ADR-03);>2 天恢复是重操作(宽扫 + re-seed)。
+
+- **候选方案**:
+  - >2 天也逐日 backfill:漂移版本落窄窗外 → 缺最新态,ADR-11 同理否决。
+  - 拉长 ful 保留 / ods 双源窗到 N 天统一处理:每天成本上升,长中断(>N)仍救不了(漂移天数不可预知)——否决。
+
+- **反悔条件**:上 CDC(保留完整变更日志)→ 中断恢复退化为重放,窗口容忍与 re-seed 均可下线。
+
+- **注**:维度全量快照模型(`_ful_d` / `_ful_m`,见 kb/24 §1.2.2)`where 1=1` 全量拉、无时间窗、无漂移,**不受本 ADR 约束**——断调度后直接跑今天一版全量,最新分区即当前态,无需逐日或范围。本 ADR 只约束 inc+merge(订单/拼团)。