소스 검색

代理商流量调控

jch 1 주 전
부모
커밋
6f1e8e0e17

+ 75 - 0
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/helper/LayerAgentFlowControlDataHelper.java

@@ -0,0 +1,75 @@
+package com.tzld.piaoquan.ad.engine.commons.helper;
+
+import com.tzld.piaoquan.ad.engine.commons.redis.AlgorithmRedisHelper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.tuple.Pair;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+@Component
+public class LayerAgentFlowControlDataHelper {
+    @Autowired
+    protected AlgorithmRedisHelper algRedisHelper;
+
+    private static final String redisKey = "ad:engine:strategy:flowcontrol:layer_agent";
+    private static final String keyFormat = "%s:%s:%s";
+
+    private volatile static Map<String, Pair<Double, Double>> layerAgentMap = Collections.emptyMap();
+
+    // 服务启动时初始化数据
+    @PostConstruct
+    public void init() {
+        Map<String, Pair<Double, Double>> map = updateLayerAgentMap();
+        layerAgentMap = Collections.unmodifiableMap(map);
+    }
+
+    // 每5分钟更新一次数据
+    @Scheduled(fixedRate = 5 * 60 * 1000)
+    public void scheduledUpdate() {
+        Map<String, Pair<Double, Double>> map = updateLayerAgentMap();
+        layerAgentMap = Collections.unmodifiableMap(map);
+    }
+
+    public static Pair<Double, Double> getWeight(String layer, String profession, String agentId) {
+        if (null != layerAgentMap) {
+            String key = String.format(keyFormat, layer, profession, agentId);
+            if (layerAgentMap.containsKey(key)) {
+                return layerAgentMap.get(key);
+            }
+        }
+        return null;
+    }
+
+    private Map<String, Pair<Double, Double>> updateLayerAgentMap() {
+        Map<String, Pair<Double, Double>> tmpLayerAgentMap = new HashMap<>();
+        try {
+            String value = algRedisHelper.get(redisKey);
+            if (null != value && !value.isEmpty()) {
+                String[] cells = value.split(",");
+                for (String cell : cells) {
+                    String[] pair = cell.split("_");
+                    if (2 == pair.length) {
+                        String key = pair[0];
+                        String[] values = pair[1].split(":");
+                        if (2 == values.length) {
+                            double cpmDiff = Double.parseDouble(values[0]);
+                            double viewRate = Double.parseDouble(values[1]);
+                            tmpLayerAgentMap.put(key, Pair.of(cpmDiff, viewRate));
+                        }
+                    }
+                }
+            }
+            log.info("update layer agent flow control success size={}", tmpLayerAgentMap.size());
+        } catch (Exception e) {
+            log.error("update layer agent flow control error", e);
+        }
+        return tmpLayerAgentMap;
+    }
+}

+ 2 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/strategy/RankStrategyBasic.java

@@ -7,6 +7,7 @@ import com.tzld.piaoquan.ad.engine.commons.dto.AdPlatformCreativeDTO;
 import com.tzld.piaoquan.ad.engine.commons.enums.CrowdLayerEnum;
 import com.tzld.piaoquan.ad.engine.commons.enums.FilterTypeEnum;
 import com.tzld.piaoquan.ad.engine.commons.enums.RedisPrefixEnum;
+import com.tzld.piaoquan.ad.engine.commons.helper.LayerAgentFlowControlDataHelper;
 import com.tzld.piaoquan.ad.engine.commons.helper.LayerCustomerFlowControlDataHelper;
 import com.tzld.piaoquan.ad.engine.commons.param.RankRecommendRequestParam;
 import com.tzld.piaoquan.ad.engine.commons.redis.AdRedisHelper;
@@ -1407,7 +1408,7 @@ public abstract class RankStrategyBasic implements RankStrategy {
                 for (AdRankItem item : items) {
                     String profession = item.getProfession();
                     String agentId = String.valueOf(item.getAgentId());
-                    Pair<Double, Double> pair = LayerCustomerFlowControlDataHelper.getWeight(layer, profession, agentId);
+                    Pair<Double, Double> pair = LayerAgentFlowControlDataHelper.getWeight(layer, profession, agentId);
                     double flowWeight = getFlowControlWeight(pair,
                             cpmPow, lowerCpmWeight, upperCpmWeight,
                             flowPow, lowerFlowWeight, upperFlowWeight,

+ 1 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/strategy/RankStrategyBy847.java

@@ -182,6 +182,7 @@ public class RankStrategyBy847 extends RankStrategyBasic {
                     adRankItem.setCpm(ObjUtil.nullOrDefault(dto.getCpm(), 90).doubleValue());
                     adRankItem.setSkuId(dto.getSkuId());
                     adRankItem.setCustomerId(dto.getCustomerId());
+                    adRankItem.setAgentId(dto.getAgentId());
                     adRankItem.setProfession(dto.getProfession());
                     adRankItem.setLandingPageType(dto.getLandingPageType());
                     adRankItem.setRandom(random.nextInt(1000));

+ 1 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/strategy/RankStrategyBy849.java

@@ -182,6 +182,7 @@ public class RankStrategyBy849 extends RankStrategyBasic {
                     adRankItem.setCpm(ObjUtil.nullOrDefault(dto.getCpm(), 90).doubleValue());
                     adRankItem.setSkuId(dto.getSkuId());
                     adRankItem.setCustomerId(dto.getCustomerId());
+                    adRankItem.setAgentId(dto.getAgentId());
                     adRankItem.setProfession(dto.getProfession());
                     adRankItem.setLandingPageType(dto.getLandingPageType());
                     adRankItem.setRandom(random.nextInt(1000));

+ 1 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/strategy/RankStrategyBy851.java

@@ -187,6 +187,7 @@ public class RankStrategyBy851 extends RankStrategyBasic {
                     adRankItem.setCpm(ObjUtil.nullOrDefault(dto.getCpm(), 90).doubleValue());
                     adRankItem.setSkuId(dto.getSkuId());
                     adRankItem.setCustomerId(dto.getCustomerId());
+                    adRankItem.setAgentId(dto.getAgentId());
                     adRankItem.setProfession(dto.getProfession());
                     adRankItem.setLandingPageType(dto.getLandingPageType());
                     adRankItem.setRandom(random.nextInt(1000));