fix(sync): reconciler 清扫环补 ad——错过的 ad.* 推送恢复自愈通道
SWEEP_ENTITY_TYPES 追加 'ad':生产对账循环阶段一逐类拉 cn reconcile 清单时纳入广告当前态(清单恒全量、确定性排序),重放走既有 content-batches 幂等管道。此前 ad 只有 cn 端点而无调用方——ad.* outbox 事件「投后即失」时 ads_ov 无自愈路径(digest 是相册维度计数,覆盖不了 无相册归属的广告;含 enabled=false 下线与硬删墓碑后的终态收敛)。 sweep() 对各类型均一处理(无 per-type 簿记),'ad' 与 'asset' 同构接入; 文件头/Stats 注释同步(四类→五类)。 测试:reconcile.e2e ⑤ 追加 runOnce 生产环断言——sweptEvents=5 (album+photo×2+ad×2)、replayApplied=2(仅 ad 新 eventId)、 ads_ov 两行投影就位(全局 albumIds NULL/定向数组)、digest 稳态不受 影响。sync 全量 e2e 4 suites/28 tests、api ads 16/16、typecheck/lint 净。 Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -1,10 +1,13 @@
|
||||
// services/sync/src/reconciler.ts —— ov 补漏对账调度器(P2 Task 4)。
|
||||
// runOnce() 两阶段,每 SYNC_RECONCILE_INTERVAL_MS 一轮(main 循环驱动):
|
||||
//
|
||||
// 阶段一「当前态清扫」:对 album/category/photo/asset 四类逐类分页拉取 cn
|
||||
// reconcile 清单(**当前状态事件**,非版本清单——Task 4 设计决策:重放走
|
||||
// 阶段一「当前态清扫」:对 album/category/photo/asset/ad 五类逐类分页拉取
|
||||
// cn reconcile 清单(**当前状态事件**,非版本清单——Task 4 设计决策:重放走
|
||||
// 既有 content-batches 管道即幂等,无需第二条拉取通道),直接签名推送到 ov
|
||||
// content-batches。sinceVersion 取 0(全量当前态)而非「per-type 已应用最大
|
||||
// content-batches。ad(ads-carousel Task 8)经此环获得 digest 之外的自愈
|
||||
// 通道——digest 是相册维度计数,覆盖不了无相册归属的广告;错过的 ad.*
|
||||
// 推送(含 enabled=false 下线与墓碑后行已删的终态)由清扫的全量当前态
|
||||
// 快照重放收敛。sinceVersion 取 0(全量当前态)而非「per-type 已应用最大
|
||||
// 版本」——cn reconcile 以**类型级全局版本阈值**过滤,类型内单实体滞后
|
||||
// (如 A 实体已 v9、B 实体 v3→v4)会被 max 掩蔽;0 则由 ov 的 eventId 幂等
|
||||
// + 版本单调把「已追平的实体」全部判重/判旧(确定性 recon:<type>:<id>:<ver>
|
||||
@@ -43,8 +46,8 @@ const DIGEST_PATH = '/v1/internal/sync/digest';
|
||||
const BOOTSTRAP_PATH = '/v1/internal/sync/bootstrap';
|
||||
const CONTENT_BATCHES_PATH = '/v1/internal/sync/content-batches';
|
||||
|
||||
/** 清扫覆盖的实体类型(slot-state 预留,无当前态可拉)。 */
|
||||
const SWEEP_ENTITY_TYPES = ['album', 'category', 'photo', 'asset'] as const;
|
||||
/** 清扫覆盖的实体类型(slot-state 预留,无当前态可拉;ad 无相册维度,清单恒全量)。 */
|
||||
const SWEEP_ENTITY_TYPES = ['album', 'category', 'photo', 'asset', 'ad'] as const;
|
||||
|
||||
const DEFAULT_RECONCILE_LIMIT = 500; // 任务口径单页上限(契约上限 1000)
|
||||
const DEFAULT_PUSH_BATCH_SIZE = 100; // content-batches 契约单批上限
|
||||
@@ -72,7 +75,7 @@ export interface SyncReconcilerOptions {
|
||||
|
||||
/** 单轮 runOnce 的观测口径(main 循环打点;测试用于断言追赶/补漏/稳态)。 */
|
||||
export interface ReconcileStats {
|
||||
/** 阶段一从 cn 拉到的当前态事件数(四类型合计)。 */
|
||||
/** 阶段一从 cn 拉到的当前态事件数(五类型合计)。 */
|
||||
sweptEvents: number;
|
||||
/** 阶段一重放中 ov 实际应用(新版本/同版本重断言)的条数。 */
|
||||
replayApplied: number;
|
||||
|
||||
Reference in New Issue
Block a user