Browse Source

ADD:融合逻辑

sunxy 1 year ago
parent
commit
50d0819dab

+ 4 - 4
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/grpcservice/RecommendGrpcService.java

@@ -3,7 +3,7 @@ package com.tzld.piaoquan.recommend.server.grpcservice;
 import com.tzld.piaoquan.recommend.server.gen.recommend.RecommendRequest;
 import com.tzld.piaoquan.recommend.server.gen.recommend.RecommendResponse;
 import com.tzld.piaoquan.recommend.server.gen.recommend.RecommendServiceGrpc;
-import com.tzld.piaoquan.recommend.server.service.RecommendService;
+import com.tzld.piaoquan.recommend.server.service.VideoRecommendService;
 import io.grpc.stub.StreamObserver;
 import net.devh.boot.grpc.server.service.GrpcService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -14,18 +14,18 @@ import org.springframework.beans.factory.annotation.Autowired;
 @GrpcService
 public class RecommendGrpcService extends RecommendServiceGrpc.RecommendServiceImplBase {
     @Autowired
-    private RecommendService recommendService;
+    private VideoRecommendService videoRecommendService;
 
     @Override
     public void homepageRecommend(RecommendRequest request, StreamObserver<RecommendResponse> responseObserver) {
-        RecommendResponse response = recommendService.homepageRecommend(request);
+        RecommendResponse response = videoRecommendService.homepageRecommend(request);
         responseObserver.onNext(response);
         responseObserver.onCompleted();
     }
 
     @Override
     public void relevantRecommend(RecommendRequest request, StreamObserver<RecommendResponse> responseObserver) {
-        RecommendResponse response = recommendService.relevantRecommend(request);
+        RecommendResponse response = videoRecommendService.relevantRecommend(request);
         responseObserver.onNext(response);
         responseObserver.onCompleted();
     }

+ 3 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/FlowPoolRecommendPipeline.java

@@ -97,6 +97,9 @@ public class FlowPoolRecommendPipeline implements ApplicationContextAware {
         Optional<RecallResult.RecallData> data = param.getRecallResult().getData().stream()
                 .filter(d -> d.getPushFrom().equals(pushFrom))
                 .findFirst();
+        if (!data.isPresent()) {
+            return Collections.emptyList();
+        }
         List<Video> videoList = data.get().getVideos();
         if (videoList == null) {
             return Collections.emptyList();

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

@@ -54,7 +54,7 @@ public class RecommendService {
     private RedisTemplate<String, String> redisTemplate;
 
 
-    private Map<Integer, String> ab_initial_config_map = new HashMap<>();
+    private final Map<Integer, String> ab_initial_config_map = new HashMap<>();
 
     @ApolloJsonValue("${ab_exp_code:{}}")
     private Map<String, Map<String, String>> abExpCodeMap;
@@ -538,7 +538,7 @@ public class RecommendService {
         }
     }
 
-    private void updateCache(RecommendRequest request, RecommendParam param, List<Video> videos) {
+    public void updateCache(RecommendRequest request, RecommendParam param, List<Video> videos) {
         if (StringUtils.isBlank(request.getMid())
                 || CollectionUtils.isEmpty(videos)) {
             return;
@@ -583,6 +583,10 @@ public class RecommendService {
 
     private void updateLastVideoCache(List<Video> videos) {
 
+        if (CollectionUtils.isEmpty(videos)) {
+            return;
+        }
+
         Consumer<String> consumer = (p) -> {
             for (int i = videos.size() - 1; i >= 0; i--) {
                 if (videos.get(i).getPushFrom().equals(p)) {

+ 99 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/VideoRecommendService.java

@@ -0,0 +1,99 @@
+package com.tzld.piaoquan.recommend.server.service;
+
+import com.google.common.base.Strings;
+import com.tzld.piaoquan.recommend.server.framework.common.User;
+import com.tzld.piaoquan.recommend.server.gen.common.Result;
+import com.tzld.piaoquan.recommend.server.gen.recommend.RecommendRequest;
+import com.tzld.piaoquan.recommend.server.gen.recommend.RecommendResponse;
+import com.tzld.piaoquan.recommend.server.gen.recommend.VideoProto;
+import com.tzld.piaoquan.recommend.server.implement.FlowPoolRecommendPipeline;
+import com.tzld.piaoquan.recommend.server.implement.TopRecommendPipeline;
+import com.tzld.piaoquan.recommend.server.model.RecommendParam;
+import com.tzld.piaoquan.recommend.server.model.Video;
+import com.tzld.piaoquan.recommend.server.service.rank.RankParam;
+import com.tzld.piaoquan.recommend.server.service.rank.RankResult;
+import com.tzld.piaoquan.recommend.server.service.rank.strategy.RankStrategy4RegionMergeModelV6;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author sunxy
+ */
+@Service
+@Slf4j
+public class VideoRecommendService {
+
+    private final Boolean newRecommendSwitch = true;
+    @Resource
+    private RecommendService recommendService;
+    @Resource
+    private TopRecommendPipeline topRecommendPipeline;
+    @Resource
+    private FlowPoolRecommendPipeline flowPoolRecommendPipeline;
+    @Resource
+    private RankStrategy4RegionMergeModelV6 rankStrategy4RegionMergeModelV6;
+
+    public RecommendResponse homepageRecommend(RecommendRequest request) {
+        return newRecommendSwitch ? recommendNew(request, 0) : recommend(request, 0);
+    }
+
+
+    public RecommendResponse relevantRecommend(RecommendRequest request) {
+        return newRecommendSwitch ? recommendNew(request, 1) : recommend(request, 1);
+    }
+
+    private RecommendResponse recommendNew(RecommendRequest request, int recommendType) {
+        User user = getUser(request);
+        List<Video> topRecommendVideoList = topRecommendPipeline.feeds(request, 0, user);
+        List<Video> flowPoolRecommendVideoList = flowPoolRecommendPipeline.feedByRec(request, recommendType);
+        RecommendParam recommendParam = recommendService.genRecommendParam(request, recommendType);
+        RankParam rankParam = recommendService.convertToRankParam(recommendParam, null);
+
+        RankResult rankResult = rankStrategy4RegionMergeModelV6.mergeAndSort(rankParam, topRecommendVideoList, flowPoolRecommendVideoList);
+
+        // 只返回size条数据
+        List<Video> videos = rankResult.getVideos();
+        if (recommendParam.getSize() < rankResult.getVideos().size()) {
+            videos = rankResult.getVideos().subList(0, recommendParam.getSize());
+        }
+
+        // 更新position
+        List<VideoProto> vps = new ArrayList<>();
+        for (int i = 0; i < videos.size(); i++) {
+            vps.add(VideoProto.newBuilder()
+                    .setPosition(i + 1)
+                    .setPushFrom(Strings.nullToEmpty(videos.get(i).getPushFrom()))
+                    .setAbCode(Strings.nullToEmpty(videos.get(i).getAbCode()))
+                    .setVideoId(videos.get(i).getVideoId())
+                    .setRovScore(videos.get(i).getRovScore())
+                    .setSortScore(videos.get(i).getSortScore())
+                    .setFlowPool(Strings.nullToEmpty(videos.get(i).getFlowPool()))
+                    .setIsInFlowPool(videos.get(i).isInFlowPool() ? 1 : 0)
+                    .setRand(videos.get(i).getRand())
+                    .build());
+        }
+
+        return RecommendResponse.newBuilder()
+                .setResult(Result.newBuilder().setCode(1).setMessage("success"))
+                .addAllVideo(vps)
+                .build();
+    }
+
+    private User getUser(RecommendRequest request) {
+        User user = new User();
+        // TODO 从request中获取用户信息
+        user.setMid(request.getMid());
+        user.setUid(request.getUid());
+        user.setRegion(request.getCityCode());
+        return user;
+    }
+
+    private RecommendResponse recommend(RecommendRequest request, int recommendType) {
+        return recommendService.recommend(request, recommendType);
+    }
+
+}

+ 4 - 4
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/web/RecommendController.java

@@ -6,7 +6,7 @@ import com.tzld.piaoquan.recommend.server.client.ProtobufUtils;
 import com.tzld.piaoquan.recommend.server.client.RecommendHttpRequest;
 import com.tzld.piaoquan.recommend.server.gen.recommend.RecommendRequest;
 import com.tzld.piaoquan.recommend.server.gen.recommend.RecommendResponse;
-import com.tzld.piaoquan.recommend.server.service.RecommendService;
+import com.tzld.piaoquan.recommend.server.service.VideoRecommendService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.MapUtils;
@@ -24,12 +24,12 @@ import org.springframework.web.bind.annotation.RestController;
 @Deprecated
 public class RecommendController {
     @Autowired
-    private RecommendService recommendService;
+    private VideoRecommendService videoRecommendService;
 
     @RequestMapping("/homepage/recommend")
     public String homepageRecommend(@RequestBody RecommendHttpRequest httpRequest) {
         MDC.put("appType", String.valueOf(httpRequest.getAppType()));
-        RecommendResponse response = recommendService.homepageRecommend(generate(httpRequest));
+        RecommendResponse response = videoRecommendService.homepageRecommend(generate(httpRequest));
         String result = "";
         try {
             result = ProtobufUtils.toJson(response);
@@ -43,7 +43,7 @@ public class RecommendController {
     public String relevantRecommend(@RequestBody RecommendHttpRequest httpRequest) {
         MDC.put("appType", String.valueOf(httpRequest.getAppType()));
 
-        RecommendResponse response = recommendService.relevantRecommend(generate(httpRequest));
+        RecommendResponse response = videoRecommendService.relevantRecommend(generate(httpRequest));
         String result = "";
         try {
             result = ProtobufUtils.toJson(response);

+ 4 - 4
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/web/RecommendV2Controller.java

@@ -9,7 +9,7 @@ import com.tzld.piaoquan.recommend.server.gen.recommend.RecommendResponse;
 import com.tzld.piaoquan.recommend.server.implement.FlowPoolRecommendPipeline;
 import com.tzld.piaoquan.recommend.server.implement.TopRecommendPipeline;
 import com.tzld.piaoquan.recommend.server.model.Video;
-import com.tzld.piaoquan.recommend.server.service.RecommendService;
+import com.tzld.piaoquan.recommend.server.service.VideoRecommendService;
 import lombok.extern.slf4j.Slf4j;
 import org.slf4j.MDC;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -27,7 +27,7 @@ import java.util.List;
 @Slf4j
 public class RecommendV2Controller {
     @Autowired
-    private RecommendService recommendService;
+    private VideoRecommendService videoRecommendService;
 
     @Resource
     TopRecommendPipeline topRecommendPipeline;
@@ -38,7 +38,7 @@ public class RecommendV2Controller {
     @RequestMapping("/homepage/recommend/v2")
     public String homepageRecommend(@RequestBody RecommendRequest httpRequest) {
         MDC.put("appType", String.valueOf(httpRequest.getAppType()));
-        RecommendResponse response = recommendService.homepageRecommend(httpRequest);
+        RecommendResponse response = videoRecommendService.homepageRecommend(httpRequest);
         String result = "";
         try {
             result = ProtobufUtils.toJson(response);
@@ -52,7 +52,7 @@ public class RecommendV2Controller {
     public String relevantRecommend(@RequestBody RecommendRequest httpRequest) {
         MDC.put("appType", String.valueOf(httpRequest.getAppType()));
 
-        RecommendResponse response = recommendService.relevantRecommend(httpRequest);
+        RecommendResponse response = videoRecommendService.relevantRecommend(httpRequest);
         String result = "";
         try {
             result = ProtobufUtils.toJson(response);