Forráskód Böngészése

feat: 全量 null uid 风控错杀修复, 剔除 V562/V563/V565/V566/V567 实验 gate

RickUserCacheJob 把 BIGINT NULL 写成字面 "null" 进风险 uid Redis Set,
导致 client 传 uid="null" 的 guest user 被错杀。原先靠 V562-V567 实验
gate 局部修复, 现全量化:

- RecommendService.makeRecommendParam: uid=="null" 时无条件把
  hitRiskUidCache 改回 false; 删除 NULL_UID_FIX_EXP_CODES + isHitNullUidFixExp
- RecallService.getFlowPoolStrategy: 把"实验组 + null uid"的复合 gate
  简化成纯 isNullUidGuest, 保持"null uid guest 不进流量池"对所有用户
  成立, 避免修复后这批 guest 涌进流量池稀释真实有效 uid 的曝光

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
yangxiaohui 7 órája
szülő
commit
3e7bfc164d

+ 4 - 25
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/RecommendService.java

@@ -435,10 +435,10 @@ public class RecommendService {
             boolean isNoneUserRisk = isNoneUserRisk(request, param);
             boolean hitRiskScene = riskScenes.contains(request.getHotSceneType());
             boolean hitRiskUidCache = riskUserCache.getUnchecked(RedisKeyConstants.Recommend.riskUserUid).contains(param.getUid());
-            // V563/V566/V567 实验补丁: 命中其一时, 把 String "null" uid 的命中改回 false,
-            // 修 RickUserCacheJob 将 BIGINT NULL 转 String.valueOf(null)="null" 写入
-            // Redis Set, 导致 client 传 "null" 字符串 uid 的 guest user 全部错杀的 bug.
-            if (hitRiskUidCache && "null".equals(param.getUid()) && isHitNullUidFixExp(request, param)) {
+            // 全量修复: RickUserCacheJob 将 BIGINT NULL 转 String.valueOf(null)="null" 写入
+            // Redis Set, 导致 client 传 "null" 字符串 uid 的 guest user 全部错杀。
+            // 命中 risk uid Set 但 uid 为字面 "null" 时, 视为错杀, 改回 false。
+            if (hitRiskUidCache && "null".equals(param.getUid())) {
                 hitRiskUidCache = false;
             }
             boolean hitRiskMidCache = riskUserCache.getUnchecked(RedisKeyConstants.Recommend.riskUserMid).contains(param.getMid());
@@ -495,27 +495,6 @@ public class RecommendService {
         return param;
     }
 
-    /**
-     * null uid 风控错杀修复的实验集 (V562/V563/V565/V566/V567/...). 命中其中任一实验时走精准修复路径;
-     * 多实验共享同一修复, 加新实验只需扩这个 Set。
-     *
-     * 走 judgeHitAlgoExp, 同时覆盖 abExpCodes 通道和 rootSessionId 尾号通道.
-     */
-    private static final Set<String> NULL_UID_FIX_EXP_CODES = new HashSet<>(Arrays.asList("562", "563", "565", "566", "567"));
-
-    private boolean isHitNullUidFixExp(RecommendRequest request, RecommendParam param) {
-        for (String code : NULL_UID_FIX_EXP_CODES) {
-            if (experimentService.judgeHitAlgoExp(
-                    param.getAppType(),
-                    request.getRootSessionId(),
-                    param.getAbExpCodes(),
-                    code)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
     private boolean isNoneUserRisk(RecommendRequest request, RecommendParam param) {
         boolean isNoneUserRisk = false;
         try {

+ 4 - 11
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/RecallService.java

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