Răsfoiți Sursa

docs(kb): 93 ADR-03 加 T+1 batch 容忍边界(幽灵更新概念)

tianyu.chu 1 săptămână în urmă
părinte
comite
70352c614d
1 a modificat fișierele cu 16 adăugiri și 0 ștergeri
  1. 16 0
      kb/93-架构决策.md

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

@@ -93,6 +93,22 @@
 
     业务高峰跨零点(如本项目订单 0-6 点高峰)下,跨日漂移是常态,双源 union 是必要机制不是 defensive。
   - ods 层**跨 dt 不去重**:同一业务 id 允许在多个 dt 分区并存(每条代表一个"时间段状态快照")——上层拉链表(SCD Type 2)的必要基础
+  - **T+1 batch 容忍边界**:
+
+    本设计基于 T+1 batch ETL,容忍范围明确:
+
+    - **可救回**:跨日漂移 1 次(双源 union 救回);同 pk 跨多日持续 update(每天 batch capture 当日 update_time 的最新版本)
+    - **不可救回**:同 pk 在两次 raw 跑批之间的"日内中间状态"——例如 10/10 02:00 状态 A → 10/10 05:00 状态 B → 10/11 02:00 状态 C,raw dt=09(10/10 03:00 跑)抓到 A,raw dt=10(10/11 03:00 跑)抓到 C,**B 永久丢失**。这是 T+1 batch 固有限制(只能 capture 跑批时刻 snapshot),要 capture B 必须上 CDC(见 §候选方案)
+
+    **如果没有 raw 宽窗 + ods 双源(即单日固定窗口 + 单源),会出现"幽灵更新"**:
+
+    设想某用户固定在每天凌晨 2 点 update 同一条记录 X:
+    - raw dt=N 任务 N+1 凌晨 3 点跑批时,X 业务库 update_time 已经变成 N+1 02:00(被覆盖到次日)
+    - 单日窗口 `[N, N+1)` 不覆盖 update_time=N+1 02:00 → raw dt=N **漏 X**
+    - 第二天 raw dt=N+1 任务 N+2 凌晨 3 点跑批时,X.update_time 又变成 N+2 02:00 → 单日窗口 `[N+1, N+2)` 又不覆盖 → **又漏**
+    - 每天都漏,X **永远捕捉不到,永远漂向后方**
+
+    宽窗(48h)+ 双源 union 配套解决幽灵更新:raw dt=N 任务窗口 [N, N+2) 抓到 X update_time=N+1 02:00 漂到 N+1 范围;ods 写 dt=N+1 时双源 union(raw dt=N + raw dt=N+1)把这条早版本归位到 ods dt=N+1 分区。
 
 - **后果**:
   - 正面:不漏漂移记录;raw 简单(只管多抓、不管分对);ods 动态分区自动归位;同 id 多 dt 并存作为拉链表底层