Переглянути джерело

Merge branch 'feature_gufengshou_20240313_add_creative_cache'

gufengshou1 1 рік тому
батько
коміт
1d709bd34a

+ 96 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/container/AdCreativeFeatureContainer.java

@@ -0,0 +1,96 @@
+package com.tzld.piaoquan.ad.engine.service.score.container;
+
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.tzld.piaoquan.ad.engine.service.remote.FeatureRemoteService;
+import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRankItem;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+@Component
+public class AdCreativeFeatureContainer {
+    private final static Logger log = LoggerFactory.getLogger(AdCreativeFeatureContainer.class);
+    @Autowired
+    FeatureRemoteService featureRemoteService;
+    protected Function<Long, AdRankItem> defaultValueFunc= k -> null;;
+    private static LoadingCache<Long, AdRankItem> cache = null;
+
+
+    public static void putIntoCache(Long key, AdRankItem value) {
+        cache.put(key, value);
+    }
+
+    public void initCache(){
+        cache = CacheBuilder.newBuilder()
+                .maximumSize(1000)
+                .refreshAfterWrite(10, TimeUnit.MINUTES)
+                .expireAfterWrite(10,TimeUnit.MINUTES)
+                .expireAfterAccess(10, TimeUnit.MINUTES)
+                .concurrencyLevel(5)
+                .build(new CacheLoader<Long, AdRankItem>() {
+                    @Override
+                    public AdRankItem load(Long key) {
+                        return AdCreativeFeatureContainer.this.load(key);
+                    }
+
+                    @Override
+                    public Map<Long, AdRankItem> loadAll(Iterable<? extends Long> keys) {
+                        return AdCreativeFeatureContainer.this.loadAll(keys);
+                    }
+                });
+    }
+
+    private AdRankItem load(Long key) {
+        AdRankItem feature = getFromCache(key);
+        if (feature == null) {
+            feature = defaultValueFunc.apply(key);
+        }
+        return feature;
+    }
+
+    private AdRankItem getFromCache(Long key) {
+
+        return  featureRemoteService.getAdFeature(key);
+    }
+
+    private  Map<Long, AdRankItem> loadAll(Iterable<? extends Long> keys) {
+        Iterator<? extends Long> ite = keys.iterator();
+        List<String> keyList = new ArrayList<>();
+        while (ite.hasNext()) {
+            keyList.add(ite.next().toString());
+        }
+        List<AdRankItem> resultList=featureRemoteService.getAllAdFeatureList(keyList);
+        Map<Long, AdRankItem> result = new HashMap<>();
+        for (int i = 0; i < resultList.size(); i++) {
+            result.put(resultList.get(i).getAdId(),resultList.get(i));
+        }
+        return result;
+    }
+    public List<AdRankItem> getAll(List<Long> creativeIds) {
+        try {
+            return cache.getAll(creativeIds).values().asList();
+        } catch (Exception e) {
+            log.error("get all failed {}", e);
+        }
+        return Collections.emptyList();
+    }
+
+    public AdRankItem get(Long creativeIds) {
+        assert cache != null;
+        try {
+            return cache.getUnchecked(creativeIds);
+        } catch (Exception e) {
+            log.error("get local cache error", e);
+        }
+        return null;
+    }
+}

+ 21 - 13
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/impl/RankServiceImpl.java

@@ -1,6 +1,7 @@
 package com.tzld.piaoquan.ad.engine.service.score.impl;
 
 import com.alibaba.fastjson.JSONObject;
+import com.tzld.piaoquan.ad.engine.service.score.container.AdCreativeFeatureContainer;
 import com.tzld.piaoquan.ad.engine.service.score.container.PidLambdaContainer;
 import com.tzld.piaoquan.ad.engine.service.score.container.PidLambdaV2Container;
 import com.tzld.piaoquan.ad.engine.service.score.dto.AdPlatformBidCreativeDTO;
@@ -40,6 +41,9 @@ public class RankServiceImpl implements RankService {
     FeatureRemoteService featureRemoteService;
     @Autowired
     RankServiceThompsonImpl rankServiceThompson;
+
+    @Autowired
+    AdCreativeFeatureContainer adCreativeFeatureContainer;
     @Value("${ad.model.cpm.max:200}")
     Double cpmMax=200d;
     @Value("${ad.model.cpm.min:30}")
@@ -60,10 +64,12 @@ public class RankServiceImpl implements RankService {
         if(userAdFeature==null){
             userAdFeature=new UserAdFeature();
         }
-        List<AdRankItem> rankItems=featureRemoteService.
-                getAllAdFeatureList(
-                        CommonCollectionUtils.toList(request.getAdIdList(),id->id.toString())
-                );
+
+//        List<AdRankItem> rankItems=featureRemoteService.
+//                getAllAdFeatureList(
+//                        CommonCollectionUtils.toList(request.getAdIdList(),id->id.toString())
+//                );
+        List<AdRankItem> rankItems=adCreativeFeatureContainer.getAll(request.getAdIdList());
         //避免recommend-feature出问题
         if(rankItems==null|| rankItems.size()==0){
             rankItems=new LinkedList<>();
@@ -124,19 +130,20 @@ public class RankServiceImpl implements RankService {
         if(userAdFeature==null){
             userAdFeature=new UserAdFeature();
         }
-        Map<String,List<AdPlatformBidCreativeDTO>> groupMap=request
+        Map<Long,List<AdPlatformBidCreativeDTO>> groupMap=request
                 .getCreativeList()
                 .stream()
-                .collect(Collectors.groupingBy(creativeDTO -> creativeDTO.getCreativeId()+""));
-
-        List<AdRankItem> rankItems=featureRemoteService.
-                getAllAdFeatureList(
-                        new ArrayList<>(groupMap.keySet())
-                );
+                .collect(Collectors.groupingBy(creativeDTO -> creativeDTO.getCreativeId()));
 
+//        List<AdRankItem> rankItems=featureRemoteService.
+//                getAllAdFeatureList(
+//                        new ArrayList<>(groupMap.keySet())
+//                );
+        List<AdRankItem> rankItems=adCreativeFeatureContainer.getAll(new ArrayList<>(groupMap.keySet()));
         for(AdRankItem item:rankItems){
             try {
-                AdPlatformBidCreativeDTO dto=groupMap.get(item.getAdId()+"").get(0);
+//                AdPlatformBidCreativeDTO dto=groupMap.get(item.getAdId()+"").get(0);
+                AdPlatformBidCreativeDTO dto=groupMap.get(item.getAdId()).get(0);
                 item.setBid1(dto.getBid1());
                 item.setBid2(dto.getBid2());
                 item.setCpa(dto.getCpa());
@@ -173,7 +180,8 @@ public class RankServiceImpl implements RankService {
         result.setCreativeId(topItem.getAdId());
         result.setPctr(topItem.getCtr());
         result.setPcvr(topItem.getCvr());
-        result.setCreativeCode(groupMap.get(topItem.getAdId()+"").get(0).getCreativeCode());
+//        result.setCreativeCode(groupMap.get(topItem.getAdId()+"").get(0).getCreativeCode());
+        result.setCreativeCode(groupMap.get(topItem.getAdId()).get(0).getCreativeCode());
         double realECpm=0d;
             //经验值 待定
         realECpm=topItem.getEcpm1();