浏览代码

fix: V563/V566 命中 uid="null" 兜底不走流量池 (AB 边界对齐)

V563/V566 修了 risk uid "null" 错杀 (commit c72e42a9 / 06df35c8) 后,
原本被 riskUser=true 挡在流量池外的 guest user 突然 riskUser=false,
涌进流量池 3 路 (QuickFlowPool / FlowPoolWithLevel / DouHotFlowPool),
稀释真实有效 uid 的曝光、污染流量池效率指标。

实现:
- RecallService.getRecallStrategy 加 isHitNullUidFixExp boolean,
  uid="null" AND (judgeHitAlgoExp("563") OR judgeHitAlgoExp("566"))
- 流量池入口加 && !isHitNullUidFixExp 兜底
- 跟现有 isHit842Exp / isHit562Exp / isHit565Exp 同风格, 就地判断

AB 边界:
- V563/V566 命中 + uid="null" → 风控修复 + 不走流量池 (实验组)
- V563/V566 命中 + 真实 uid → 行为不变 (实验组)
- 非 V563/V566 + uid="null" → 仍 riskUser=true → 不走流量池 (控制组)
- 非 V563/V566 + 真实 uid → 行为不变 (控制组)
非命中流量池行为不被新逻辑污染, 控制组保持现状, AB 仍可对比。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
yangxiaohui 1 周之前
父节点
当前提交
5e8c553678

+ 9 - 1
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/RecallService.java

@@ -211,9 +211,17 @@ public class RecallService implements ApplicationContextAware {
         // 由 V564 rank 类 (mergeAndRankRovRecall) 在 extractAllAndTruncateByCoarseRank
         // 里按全局粗排分统一截断。
 
+        // V563/V566 命中且 uid="null" 的 guest user 不走流量池: V563/V566 修了 risk uid
+        // "null" 错杀, 这批 guest 不再 setRiskUser(true), 不在此处隔离会涌进流量池稀释
+        // 真实有效 uid 的曝光。非 V563/V566 用户继续走 bug 路径 (riskUser=true), 已被
+        // 第一个条件挡掉, 此 gate 与风控修复 AB 边界严格对齐。
+        boolean isHitNullUidFixExp = "null".equals(param.getUid())
+                && (experimentService.judgeHitAlgoExp(param.getAppType(), param.getRootSessionId(), abExpCodes, "563")
+                    || experimentService.judgeHitAlgoExp(param.getAppType(), param.getRootSessionId(), abExpCodes, "566"));
+
         // 命中用户黑名单不走流量池
         // 命中安全测试风险地域不走流量池
-        if (!param.isRiskUser() && !param.isTestingRiskRegion()) {
+        if (!param.isRiskUser() && !param.isTestingRiskRegion() && !isHitNullUidFixExp) {
             strategies.add(strategyMap.get(QuickFlowPoolWithLevelRecallStrategy.class.getSimpleName()));
             strategies.add(strategyMap.get(FlowPoolWithLevelRecallStrategyTomson.class.getSimpleName()));
             strategies.add(strategyMap.get(DouHotFlowPoolRecallStrategy.class.getSimpleName()));