丁云鹏 1 年之前
父节点
当前提交
4a5d84bb20

+ 5 - 1
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/common/ThreadPoolFactory.java

@@ -25,7 +25,7 @@ public final class ThreadPoolFactory {
             new LinkedBlockingQueue<>(1000),
             new ThreadFactoryBuilder().setNameFormat("RecallService-%d").build(),
             new ThreadPoolExecutor.AbortPolicy());
-    public final static ExecutorService FILTER = new CommonThreadPoolExecutor(
+    private final static ExecutorService FILTER = new CommonThreadPoolExecutor(
             256,
             256,
             0L, TimeUnit.SECONDS,
@@ -41,4 +41,8 @@ public final class ThreadPoolFactory {
         return RECALL;
     }
 
+    public static ExecutorService filterPool() {
+        return FILTER;
+    }
+
 }

+ 2 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/RecommendService.java

@@ -409,6 +409,8 @@ public class RecommendService {
         recallParam.setRiskFilterFlag(param.getRiskFilterFlag());
         recallParam.setVideosWithRisk(param.getVideosWithRisk());
         recallParam.setAppRegionFiltered(param.getAppRegionFiltered());
+        recallParam.setAbExpCodes(param.getAbExpCodes());
+
 
         return recallParam;
     }

+ 23 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/ServiceBeanFactory.java

@@ -0,0 +1,23 @@
+package com.tzld.piaoquan.recommend.server.service;
+
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author dyp
+ */
+@Component
+public class ServiceBeanFactory implements ApplicationContextAware {
+    private static ApplicationContext applicationContext;
+
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        this.applicationContext = applicationContext;
+    }
+
+    public static <T> T getBean(Class<T> clazz) {
+        return applicationContext.getBean(clazz);
+    }
+}

+ 91 - 9
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/filter/AbstractFilterService.java

@@ -1,34 +1,45 @@
 package com.tzld.piaoquan.recommend.server.service.filter;
 
+import com.tzld.piaoquan.recommend.server.common.ThreadPoolFactory;
 import com.tzld.piaoquan.recommend.server.service.PreViewedService;
+import com.tzld.piaoquan.recommend.server.service.ServiceBeanFactory;
 import com.tzld.piaoquan.recommend.server.service.ViewedService;
-import com.tzld.piaoquan.recommend.server.service.recall.RecallStrategy;
+import com.tzld.piaoquan.recommend.server.service.filter.strategy.*;
+import com.tzld.piaoquan.recommend.server.util.CommonCollectionUtils;
+import com.tzld.piaoquan.recommend.server.util.JSONUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationContextAware;
+import org.springframework.beans.factory.annotation.Value;
 
 import java.util.*;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
  * @author dyp
  */
 @Slf4j
-public abstract class AbstractFilterService implements ApplicationContextAware {
+public abstract class AbstractFilterService {
     @Autowired
     private PreViewedService preViewedService;
 
     @Autowired
     private ViewedService viewedService;
 
-    protected final Map<String, RecallStrategy> strategyMap = new HashMap<>();
+    private ExecutorService pool = ThreadPoolFactory.filterPool();
 
-    protected ApplicationContext applicationContext;
+    @Value("${newFilterGlobalSwitch:false}")
+    private boolean newFilterGlobalSwitch;
+    @Value("${newFilterAbExpCode:}")
+    private String newFilterAbExpCode;
 
-    protected List<Long> viewFilter(FilterParam param) {
+
+    private List<Long> viewFilterOld(FilterParam param) {
         // log.info("filterParam={}", JSONUtils.toJson(param));
         // 风险过滤
         List<Long> videoIds = filterWithRiskVideo(param.getRiskFilterFlag(),
@@ -107,9 +118,80 @@ public abstract class AbstractFilterService implements ApplicationContextAware {
         }
     }
 
-    protected boolean isNewFilter() {
-        return false;
+    protected List<Long> viewFilter(FilterParam param) {
+        boolean hit = newFilterGlobalSwitch
+                || CommonCollectionUtils.contains(param.getAbExpCodes(), newFilterAbExpCode);
+        if (hit) {
+            return viewFilterNew(param);
+        } else {
+            return viewFilterOld(param);
+        }
+    }
+
+    private List<Long> viewFilterNew(FilterParam param) {
+
+        // hardcode : 风险过滤会做截断,所以先同步调用
+        List<Long> riskVideoIds = filterWithRiskVideo(param.getRiskFilterFlag(),
+                param.getAppType(), param.getRegionCode(), param.getAppRegionFiltered(), param.getVideosWithRisk(),
+                param.getVideoIds(), param.getForceTruncation());
+        param.setVideoIds(riskVideoIds);
+
+        List<FilterStrategy> strategies = getStrategies(param);
+        log.info("strategies {}", JSONUtils.toJson(CommonCollectionUtils.toList(strategies, o -> o.getClass().getSimpleName())));
+        CountDownLatch cdl = new CountDownLatch(strategies.size());
+        List<Future<List<Long>>> futures = new ArrayList<>();
+        for (final FilterStrategy strategy : strategies) {
+            Future<List<Long>> future = pool.submit(() -> {
+                List<Long> result = strategy.filter(param);
+                cdl.countDown();
+                return result;
+            });
+            futures.add(future);
+        }
+        try {
+            cdl.await(3000, TimeUnit.MILLISECONDS);
+        } catch (InterruptedException e) {
+            log.error("recall error", e);
+            return null;
+        }
+
+        List<List<Long>> videoIds = new ArrayList<>();
+        for (Future<List<Long>> f : futures) {
+            try {
+                videoIds.add(f.get());
+            } catch (Exception e) {
+                log.error("future get error ", e);
+            }
+        }
+        if (CollectionUtils.isEmpty(videoIds)) {
+            return Collections.emptyList();
+        }
+        List<Long> result = videoIds.get(0);
+        for (int i = 1; i < videoIds.size(); ++i) {
+            result.retainAll(videoIds.get(i));
+        }
+        return result;
     }
 
+    private List<FilterStrategy> getStrategies(FilterParam param) {
+        List<FilterStrategy> strategies = new ArrayList<>();
+        strategies.add(ServiceBeanFactory.getBean(PreViewedStrategy.class));
+        strategies.add(ServiceBeanFactory.getBean(ViewedStrategy.class));
+        strategies.add(ServiceBeanFactory.getBean(RecommendStatusStrategy.class));
+        switch (param.getAppType()) {
+            case 0:
+            case 4:
+                strategies.add(ServiceBeanFactory.getBean(AllowListStrategy.class));
+                break;
+            case 13:
+                break;
+            default:
+                strategies.add(ServiceBeanFactory.getBean(AllowListStrategy.class));
+                strategies.add(ServiceBeanFactory.getBean(TagStrategy.class));
+                break;
+        }
+
+        return strategies;
+    }
 
 }

+ 2 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/filter/FilterParam.java

@@ -4,6 +4,7 @@ import lombok.Data;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * @author dyp
@@ -22,4 +23,5 @@ public class FilterParam {
     private List<Long> videosWithRisk;
     private String regionCode;
     private int forceTruncation;
+    private Set<String> abExpCodes;
 }

+ 0 - 12
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/filter/VideoFilterService.java

@@ -10,20 +10,8 @@ import java.util.List;
 @Service
 public class VideoFilterService extends AbstractFilterService {
     public FilterResult filter(FilterParam param) {
-        if (isNewFilter()) {
-            return filterNew(param);
-        } else {
-            return filterOld(param);
-        }
-    }
-
-    private FilterResult filterOld(FilterParam param) {
         List<Long> videoIds = viewFilter(param);
 
         return new FilterResult(videoIds);
     }
-
-    private FilterResult filterNew(FilterParam param) {
-
-    }
 }

+ 2 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/FilterParamFactory.java

@@ -23,6 +23,7 @@ public class FilterParamFactory {
         filterParam.setVideosWithRisk(param.getVideosWithRisk());
         filterParam.setAppRegionFiltered(param.getAppRegionFiltered());
         filterParam.setRegionCode(param.getRegionCode());
+        filterParam.setAbExpCodes(param.getAbExpCodes());
         return filterParam;
     }
 
@@ -37,6 +38,7 @@ public class FilterParamFactory {
         filterParam.setVideosWithRisk(param.getVideosWithRisk());
         filterParam.setAppRegionFiltered(param.getAppRegionFiltered());
         filterParam.setRegionCode(param.getRegionCode());
+        filterParam.setAbExpCodes(param.getAbExpCodes());
         return filterParam;
     }
 }

+ 2 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/RecallParam.java

@@ -4,6 +4,7 @@ import lombok.Data;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * @author dyp
@@ -30,5 +31,6 @@ public class RecallParam {
     private Boolean riskFilterFlag;
     private Map<Integer, List<String>> appRegionFiltered;
     private List<Long> videosWithRisk;
+    private Set<String> abExpCodes;
 
 }