From 95b3f5edd9db3e6755213208d7d0e78e793271fa Mon Sep 17 00:00:00 2001 From: llIlll <10194588+llIlll@users.noreply.github.com> Date: Fri, 25 Sep 2020 14:23:15 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E9=80=82=E5=BA=94=E8=B4=9F=E8=BD=BD?= =?UTF-8?q?=E5=9D=87=E8=A1=A1=E4=BC=98=E5=8C=96=20(#309)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 优化客户端自适应负载均衡效果,修复客户端生产不均匀问题 --- .../support/AdaptivePartitionSelector.java | 7 +- .../support/WeightedPartitionSelector.java | 28 ++- .../pom.xml | 4 - .../adaptive/AdaptiveLoadBalance.java | 30 +--- .../config/AdaptiveLoadBalanceConfig.java | 21 ++- .../adaptive/judge/AvailableScoreJudge.java | 11 +- ...TP99ScoreJudge.java => AvgScoreJudge.java} | 26 +-- .../adaptive/judge/RegionScoreJudge.java | 2 +- .../loadbalance/adaptive/node/Metric.java | 9 +- .../loadbalance/adaptive/node/Metrics.java | 47 +++-- .../loadbalance/adaptive/node/Node.java | 1 + .../loadbalance/adaptive/node/Nodes.java | 1 + ...eue.client.loadbalance.adaptive.ScoreJudge | 4 +- .../adaptive/AdaptiveLoadBalanceTest.java | 165 ------------------ .../adaptive/AvailableScoreJudgeTest.java | 60 ------- .../adaptive/RegionScoreJudgeTest.java | 56 ------ .../adaptive/TP99ScoreJudgeTest.java | 60 ------- styles/checkstyle.xml | 12 +- 18 files changed, 116 insertions(+), 428 deletions(-) rename joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/judge/{TP99ScoreJudge.java => AvgScoreJudge.java} (57%) delete mode 100644 joyqueue-client/joyqueue-client-loadbalance-adaptive/src/test/java/org/joyqueue/client/loadbalance/adaptive/AdaptiveLoadBalanceTest.java delete mode 100644 joyqueue-client/joyqueue-client-loadbalance-adaptive/src/test/java/org/joyqueue/client/loadbalance/adaptive/AvailableScoreJudgeTest.java delete mode 100644 joyqueue-client/joyqueue-client-loadbalance-adaptive/src/test/java/org/joyqueue/client/loadbalance/adaptive/RegionScoreJudgeTest.java delete mode 100644 joyqueue-client/joyqueue-client-loadbalance-adaptive/src/test/java/org/joyqueue/client/loadbalance/adaptive/TP99ScoreJudgeTest.java diff --git a/joyqueue-client/joyqueue-client-core/src/main/java/org/joyqueue/client/internal/producer/support/AdaptivePartitionSelector.java b/joyqueue-client/joyqueue-client-core/src/main/java/org/joyqueue/client/internal/producer/support/AdaptivePartitionSelector.java index 4686d1347..6e85f86e8 100644 --- a/joyqueue-client/joyqueue-client-core/src/main/java/org/joyqueue/client/internal/producer/support/AdaptivePartitionSelector.java +++ b/joyqueue-client/joyqueue-client-core/src/main/java/org/joyqueue/client/internal/producer/support/AdaptivePartitionSelector.java @@ -68,7 +68,12 @@ protected Nodes getTopicNodes(TopicMetadata topicMetadata, List brok if (node == null) { node = new Node(); node.setUrl(String.valueOf(brokerNode.getId())); - node.setNearby(brokerNode.isNearby()); + + if (topicMetadata.getProducerPolicy() != null && topicMetadata.getProducerPolicy().getNearby() != null) { + node.setNearby(topicMetadata.getProducerPolicy().getNearby() && brokerNode.isNearby()); + } else { + node.setNearby(false); + } Node oldNode = brokerNode.putIfAbsentAttachment(NODE_CACHE_KEY, node); if (oldNode != null) { diff --git a/joyqueue-client/joyqueue-client-core/src/main/java/org/joyqueue/client/internal/producer/support/WeightedPartitionSelector.java b/joyqueue-client/joyqueue-client-core/src/main/java/org/joyqueue/client/internal/producer/support/WeightedPartitionSelector.java index b194ec9e5..9996b0b05 100644 --- a/joyqueue-client/joyqueue-client-core/src/main/java/org/joyqueue/client/internal/producer/support/WeightedPartitionSelector.java +++ b/joyqueue-client/joyqueue-client-core/src/main/java/org/joyqueue/client/internal/producer/support/WeightedPartitionSelector.java @@ -15,8 +15,9 @@ */ package org.joyqueue.client.internal.producer.support; -import com.jd.laf.extension.Extension; +import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.RandomUtils; +import org.joyqueue.client.internal.metadata.domain.PartitionGroupMetadata; import org.joyqueue.client.internal.metadata.domain.PartitionNode; import org.joyqueue.client.internal.metadata.domain.TopicMetadata; import org.joyqueue.client.internal.producer.domain.ProduceMessage; @@ -30,7 +31,6 @@ * author: gaohaoxiang * date: 2018/12/27 */ -@Extension(singleton = false) public class WeightedPartitionSelector extends AbstractPartitionSelector { public static final String NAME = "weighted"; @@ -41,13 +41,25 @@ protected PartitionNode nextPartition(ProduceMessage message, TopicMetadata topi double weight = 0; int index = 0; - for (BrokerNode brokerNode : brokerNodes) { - weights[index] = brokerNode.getWeight(); - if (weights[index] < 0) { - weights[index] = 0; + if (topicMetadata.getProducerPolicy() != null && MapUtils.isNotEmpty(topicMetadata.getProducerPolicy().getWeight())) { + for (BrokerNode brokerNode : brokerNodes) { + weights[index] = brokerNode.getWeight(); + if (weights[index] < 0) { + weights[index] = 0; + } + weight += weights[index]; + index++; + } + } else { + for (BrokerNode brokerNode : brokerNodes) { + List brokerPartitionGroups = topicMetadata.getBrokerPartitionGroups(brokerNode.getId()); + weights[index] = (brokerPartitionGroups != null ? brokerPartitionGroups.size() * 10 : brokerNode.getWeight()); + if (weights[index] < 0) { + weights[index] = 0; + } + weight += weights[index]; + index++; } - weight += weights[index]; - index++; } if (weight > 0) { diff --git a/joyqueue-client/joyqueue-client-loadbalance-adaptive/pom.xml b/joyqueue-client/joyqueue-client-loadbalance-adaptive/pom.xml index 36dbe0ccd..2db91b67e 100644 --- a/joyqueue-client/joyqueue-client-loadbalance-adaptive/pom.xml +++ b/joyqueue-client/joyqueue-client-loadbalance-adaptive/pom.xml @@ -15,10 +15,6 @@ io.dropwizard.metrics metrics-core - - com.google.guava - guava - junit diff --git a/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/AdaptiveLoadBalance.java b/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/AdaptiveLoadBalance.java index 8bf7b17e9..720a775b7 100644 --- a/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/AdaptiveLoadBalance.java +++ b/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/AdaptiveLoadBalance.java @@ -1,16 +1,15 @@ package org.joyqueue.client.loadbalance.adaptive; -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; import org.joyqueue.client.loadbalance.adaptive.config.AdaptiveLoadBalanceConfig; +import org.joyqueue.client.loadbalance.adaptive.node.Metrics; import org.joyqueue.client.loadbalance.adaptive.node.Node; import org.joyqueue.client.loadbalance.adaptive.node.Nodes; import org.joyqueue.client.loadbalance.adaptive.node.WeightNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; /** * AdaptiveLoadBalance @@ -19,20 +18,19 @@ */ public class AdaptiveLoadBalance { + protected static final Logger logger = LoggerFactory.getLogger(AdaptiveLoadBalance.class); + private AdaptiveLoadBalanceConfig config; private List scoreJudges; private WeightLoadBalance weightLoadBalance = new WeightLoadBalance(); private RandomLoadBalance randomLoadBalance = new RandomLoadBalance(); - private Cache selectCache; - public AdaptiveLoadBalance(AdaptiveLoadBalanceConfig config) { this.config = config; this.scoreJudges = getScoreJudges(config); - this.selectCache = CacheBuilder.newBuilder() - .expireAfterWrite(config.getComputeInterval(), TimeUnit.MILLISECONDS) - .build(); + Metrics.cacheInterval = config.getCacheInterval(); + Metrics.sliceInterval = config.getSliceInterval(); } protected List getScoreJudges(AdaptiveLoadBalanceConfig config) { @@ -53,18 +51,11 @@ public Node select(Nodes nodes) { } protected boolean isStartup(Nodes nodes) { - return nodes.getMetric().getTps() > config.getSsthreshhold(); + return nodes.getMetric().getCount() > config.getSsthreshhold(); } protected Node adaptiveSelect(Nodes nodes) { - String cacheKey = nodes.toString(); - try { - return selectCache.get(cacheKey, () -> { - return doAdaptiveSelect(nodes); - }); - } catch (ExecutionException e) { - return doAdaptiveSelect(nodes); - } + return doAdaptiveSelect(nodes); } public Node doAdaptiveSelect(Nodes nodes) { @@ -75,9 +66,6 @@ public Node doAdaptiveSelect(Nodes nodes) { double compute = scoreJudge.compute(nodes, node); score += (compute / 100 * scoreJudge.getRatio()); } - if (score == 0) { - score = 1; - } weightNodes.add(new WeightNode(node, score)); } return weightSelect(weightNodes); diff --git a/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/config/AdaptiveLoadBalanceConfig.java b/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/config/AdaptiveLoadBalanceConfig.java index 7414b8aa0..3cc8f8b8f 100644 --- a/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/config/AdaptiveLoadBalanceConfig.java +++ b/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/config/AdaptiveLoadBalanceConfig.java @@ -7,9 +7,10 @@ */ public class AdaptiveLoadBalanceConfig { - private int ssthreshhold = 10; + private int ssthreshhold = 1000; private String[] judges; - private int computeInterval = 1000 * 1; + private int cacheInterval = 1000 * 1; + private int sliceInterval = 1000 * 60; public int getSsthreshhold() { return ssthreshhold; @@ -27,11 +28,19 @@ public void setJudges(String[] judges) { this.judges = judges; } - public int getComputeInterval() { - return computeInterval; + public int getCacheInterval() { + return cacheInterval; } - public void setComputeInterval(int computeInterval) { - this.computeInterval = computeInterval; + public void setCacheInterval(int cacheInterval) { + this.cacheInterval = cacheInterval; + } + + public int getSliceInterval() { + return sliceInterval; + } + + public void setSliceInterval(int sliceInterval) { + this.sliceInterval = sliceInterval; } } \ No newline at end of file diff --git a/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/judge/AvailableScoreJudge.java b/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/judge/AvailableScoreJudge.java index 314088ff4..bb6ab1cc4 100644 --- a/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/judge/AvailableScoreJudge.java +++ b/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/judge/AvailableScoreJudge.java @@ -13,15 +13,10 @@ public class AvailableScoreJudge implements ScoreJudge { @Override public double compute(Nodes nodes, Node node) { - if (node.getMetric().getErrorTps() == 0) { - return 0; - } else if (nodes.getMetric().getErrorTps() == 0) { - return -100; - } else if (node.getMetric().getErrorTps() >= nodes.getMetric().getErrorTps()) { - return -100; - } else { - return -Math.min(100 - ((double) (node.getMetric().getErrorTps() / nodes.getMetric().getErrorTps()) * 100), 100); + if (node.getMetric().getErrorCount() != 0) { + return -Integer.MAX_VALUE; } + return 0; } @Override diff --git a/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/judge/TP99ScoreJudge.java b/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/judge/AvgScoreJudge.java similarity index 57% rename from joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/judge/TP99ScoreJudge.java rename to joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/judge/AvgScoreJudge.java index 600369b55..ca287441b 100644 --- a/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/judge/TP99ScoreJudge.java +++ b/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/judge/AvgScoreJudge.java @@ -5,23 +5,29 @@ import org.joyqueue.client.loadbalance.adaptive.node.Nodes; /** - * TP99ScoreJudge + * AvgScoreJudge * author: gaohaoxiang * date: 2020/8/10 */ -public class TP99ScoreJudge implements ScoreJudge { +public class AvgScoreJudge implements ScoreJudge { - private static final double BASE_SCORE = 50; + public static int exceptionThreshhold = 500; @Override public double compute(Nodes nodes, Node node) { - double score = node.getMetric().getTp99() - nodes.getMetric().getTp99(); - if (score > 0) { - return 0; - } else if (score == 0) { - return BASE_SCORE; + double maxAvg = 0; + for (Node otherNode : nodes.getNodes()) { + if (!otherNode.getUrl().equals(node.getUrl())) { + maxAvg = Math.max(maxAvg, otherNode.getMetric().getAvg()); + } + } + + double score = node.getMetric().getAvg() / maxAvg * 100; + + if (score > exceptionThreshhold) { + return -Integer.MAX_VALUE; } else { - return BASE_SCORE + Math.min(format(-score), BASE_SCORE); + return 100; } } @@ -42,6 +48,6 @@ public double getRatio() { @Override public String type() { - return "tp99"; + return "avg"; } } \ No newline at end of file diff --git a/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/judge/RegionScoreJudge.java b/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/judge/RegionScoreJudge.java index 066cda3b6..2b4c650e4 100644 --- a/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/judge/RegionScoreJudge.java +++ b/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/judge/RegionScoreJudge.java @@ -16,7 +16,7 @@ public double compute(Nodes nodes, Node node) { if (node.isNearby()) { return 100; } - return 0; + return 1; } @Override diff --git a/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/node/Metric.java b/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/node/Metric.java index f6d2126e3..6215b58d5 100644 --- a/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/node/Metric.java +++ b/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/node/Metric.java @@ -10,6 +10,11 @@ public class Metric { private Metrics all = new Metrics(); private Metrics error = new Metrics(); + public void refresh() { + all.refresh(); + error.reinit(); + } + public Tracer begin() { return new Tracer(this); } @@ -53,10 +58,6 @@ public double getTp75() { return all.getTp75(); } - public double getTp90() { - return all.getTp90(); - } - public double getMax() { return all.getMax(); } diff --git a/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/node/Metrics.java b/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/node/Metrics.java index 758f7bc0c..61acafe5d 100644 --- a/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/node/Metrics.java +++ b/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/node/Metrics.java @@ -13,30 +13,45 @@ */ public class Metrics { - private Meter meter; - private Reservoir reservoir; - private Histogram histogram; + public static int cacheInterval = 1000 * 1; + public static int sliceInterval = 1000 * 60; + + private volatile Meter meter; + private volatile Reservoir reservoir; + private volatile Histogram histogram; + + private volatile long lastSlice; + + private volatile double lastAvg; + private volatile long lastAvgTime; public Metrics() { init(); } - public void slice() { - init(); + public void init() { + this.meter = new Meter(); + this.reservoir = new ExponentiallyDecayingReservoir(); + this.histogram = new Histogram(reservoir); } - protected void init() { - this.meter = new Meter(); + public void slice() { this.reservoir = new ExponentiallyDecayingReservoir(); this.histogram = new Histogram(reservoir); } - public void mark() { - this.mark(1L); + public void refresh() { + if (System.currentTimeMillis() - lastSlice > sliceInterval) { + lastSlice = System.currentTimeMillis(); + slice(); + } } - public void mark(long count) { - this.meter.mark(count); + public void reinit() { + if (System.currentTimeMillis() - lastSlice > sliceInterval) { + lastSlice = System.currentTimeMillis(); + init(); + } } public void mark(long count, double time) { @@ -72,10 +87,6 @@ public double getTp75() { return this.getSnapshot().get75thPercentile(); } - public double getTp90() { - return this.getSnapshot().getMean(); - } - public double getMax() { return this.getSnapshot().getMax(); } @@ -85,7 +96,11 @@ public double getMin() { } public double getAvg() { - return this.getSnapshot().getMean(); + if (System.currentTimeMillis() - lastAvgTime > cacheInterval) { + lastAvg = this.getSnapshot().getMean(); + lastAvgTime = System.currentTimeMillis(); + } + return lastAvg; } protected Snapshot getSnapshot() { diff --git a/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/node/Node.java b/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/node/Node.java index 9a99e907c..edeac043e 100644 --- a/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/node/Node.java +++ b/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/node/Node.java @@ -29,6 +29,7 @@ public void setUrl(String url) { } public Metric getMetric() { + metric.refresh(); return metric; } diff --git a/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/node/Nodes.java b/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/node/Nodes.java index 68388fa57..1a41f0145 100644 --- a/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/node/Nodes.java +++ b/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/java/org/joyqueue/client/loadbalance/adaptive/node/Nodes.java @@ -25,6 +25,7 @@ public void setMetric(Metric metric) { } public Metric getMetric() { + metric.refresh(); return metric; } diff --git a/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/resources/META-INF/services/org.joyqueue.client.loadbalance.adaptive.ScoreJudge b/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/resources/META-INF/services/org.joyqueue.client.loadbalance.adaptive.ScoreJudge index 7551b8abe..a72760079 100644 --- a/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/resources/META-INF/services/org.joyqueue.client.loadbalance.adaptive.ScoreJudge +++ b/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/main/resources/META-INF/services/org.joyqueue.client.loadbalance.adaptive.ScoreJudge @@ -1,3 +1,3 @@ -org.joyqueue.client.loadbalance.adaptive.judge.RegionScoreJudge -org.joyqueue.client.loadbalance.adaptive.judge.TP99ScoreJudge +#org.joyqueue.client.loadbalance.adaptive.judge.RegionScoreJudge +org.joyqueue.client.loadbalance.adaptive.judge.AvgScoreJudge org.joyqueue.client.loadbalance.adaptive.judge.AvailableScoreJudge \ No newline at end of file diff --git a/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/test/java/org/joyqueue/client/loadbalance/adaptive/AdaptiveLoadBalanceTest.java b/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/test/java/org/joyqueue/client/loadbalance/adaptive/AdaptiveLoadBalanceTest.java deleted file mode 100644 index f8f0d2993..000000000 --- a/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/test/java/org/joyqueue/client/loadbalance/adaptive/AdaptiveLoadBalanceTest.java +++ /dev/null @@ -1,165 +0,0 @@ -package org.joyqueue.client.loadbalance.adaptive; - -import org.joyqueue.client.loadbalance.adaptive.config.AdaptiveLoadBalanceConfig; -import org.joyqueue.client.loadbalance.adaptive.node.Metric; -import org.joyqueue.client.loadbalance.adaptive.node.Node; -import org.joyqueue.client.loadbalance.adaptive.node.Nodes; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mockito; - -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -/** - * AdaptiveLoadBalanceTest - * author: gaohaoxiang - * date: 2020/8/10 - */ -public class AdaptiveLoadBalanceTest { - - private Nodes nodes; - private Node node1; - private Node node2; - private Node node3; - private AdaptiveLoadBalance adaptiveLoadBalance; - - @Before - public void before() { - AdaptiveLoadBalanceConfig config = new AdaptiveLoadBalanceConfig(); - adaptiveLoadBalance = new AdaptiveLoadBalance(config); - - node1 = Mockito.mock(Node.class); - Mockito.when(node1.getUrl()).thenReturn("node1"); - Mockito.when(node1.isNearby()).thenReturn(false); - Mockito.when(node1.getMetric()).thenReturn(Mockito.mock(Metric.class)); - Mockito.when(node1.getMetric().getTp99()).thenReturn(0.1); - - node2 = Mockito.mock(Node.class); - Mockito.when(node2.getUrl()).thenReturn("node2"); - Mockito.when(node2.isNearby()).thenReturn(false); - Mockito.when(node2.getMetric()).thenReturn(Mockito.mock(Metric.class)); - Mockito.when(node2.getMetric().getTp99()).thenReturn(0.2); - - node3 = Mockito.mock(Node.class); - Mockito.when(node3.getUrl()).thenReturn("node3"); - Mockito.when(node3.isNearby()).thenReturn(false); - Mockito.when(node3.getMetric()).thenReturn(Mockito.mock(Metric.class)); - Mockito.when(node3.getMetric().getTp99()).thenReturn(0.3); - - nodes = Mockito.mock(Nodes.class); - Mockito.when(nodes.getMetric()).thenReturn(Mockito.mock(Metric.class)); - Mockito.when(nodes.getMetric().getTp99()).thenReturn(0.2); - Mockito.when(nodes.getMetric().getTps()).thenReturn(100L); - Mockito.when(nodes.getNodes()).thenReturn(Arrays.asList(node1, node2, node3)).getMock(); - } - - protected Map execute() { - Map counterMap = new HashMap<>(); - for (int i = 0; i < 10000; i++) { - Node node = adaptiveLoadBalance.select(nodes); - if (node != null) { - int counter = counterMap.getOrDefault(node.getUrl(), 0); - counter++; - counterMap.put(node.getUrl(), counter); - } - } - return counterMap; - } - - @Test - public void simpleTest() { - Map counterMap = execute(); - - Assert.assertTrue(counterMap.get("node1") > counterMap.get("node2")); - Assert.assertTrue(counterMap.get("node2") > counterMap.get("node3")); - } - - @Test - public void regionTest() { - Mockito.when(node3.isNearby()).thenReturn(true); - - Map counterMap = execute(); - - Assert.assertTrue(counterMap.get("node3") > counterMap.get("node1")); - Assert.assertTrue(counterMap.get("node1") > counterMap.get("node2")); - } - - @Test - public void errorTest() { - Mockito.when(node1.getMetric().getErrorTps()).thenReturn(1L); - Mockito.when(node2.getMetric().getErrorTps()).thenReturn(2L); - Mockito.when(node3.getMetric().getErrorTps()).thenReturn(3L); - Mockito.when(nodes.getMetric().getErrorTps()).thenReturn(5L); - - Map counterMap = execute(); - -// Assert.assertTrue(counterMap.get("node1") >= counterMap.get("node2")); -// Assert.assertTrue(counterMap.get("node2") >= counterMap.get("node3")); - } - - @Test - public void regionAndErrorTest() { - Mockito.when(node3.getMetric().getErrorTps()).thenReturn(3L); - Mockito.when(node3.isNearby()).thenReturn(true); - Mockito.when(nodes.getMetric().getErrorTps()).thenReturn(3L); - - Map counterMap = execute(); - - Assert.assertTrue(counterMap.get("node1") > counterMap.get("node3")); - Assert.assertTrue(counterMap.get("node1") > counterMap.get("node2")); - - Mockito.when(node3.isNearby()).thenReturn(false); - - counterMap = execute(); - - Assert.assertTrue(counterMap.get("node1") > counterMap.get("node2")); -// Assert.assertTrue(counterMap.get("node2") > counterMap.get("node3")); - } - - @Test - public void customJudgeTest() { - AdaptiveLoadBalanceConfig config = new AdaptiveLoadBalanceConfig(); - config.setJudges(new String[] {"tp99"}); - adaptiveLoadBalance = new AdaptiveLoadBalance(config); - - Mockito.when(node3.isNearby()).thenReturn(true); - - Map counterMap = execute(); - - Assert.assertTrue(counterMap.get("node1") > counterMap.get("node2")); - Assert.assertTrue(counterMap.get("node2") > counterMap.get("node3")); - } - - @Test - public void randomTest() { - Mockito.when(nodes.getMetric().getTps()).thenReturn(0L).getMock(); - - Map counterMap = execute(); - - Assert.assertTrue(counterMap.containsKey("node1")); - Assert.assertTrue(counterMap.containsKey("node2")); - Assert.assertTrue(counterMap.containsKey("node3")); - } - - @Test - public void singoleNodeTest() { - Mockito.when(nodes.getNodes()).thenReturn(Arrays.asList(node1)).getMock(); - - Map counterMap = execute(); - - Assert.assertTrue(counterMap.containsKey("node1")); - Assert.assertTrue(!counterMap.containsKey("node2")); - Assert.assertTrue(!counterMap.containsKey("node3")); - } - - @Test - public void emptyNodeTest() { - Mockito.when(nodes.getNodes()).thenReturn(Collections.emptyList()).getMock(); - Map counterMap = execute(); - Assert.assertTrue(counterMap.isEmpty()); - } -} \ No newline at end of file diff --git a/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/test/java/org/joyqueue/client/loadbalance/adaptive/AvailableScoreJudgeTest.java b/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/test/java/org/joyqueue/client/loadbalance/adaptive/AvailableScoreJudgeTest.java deleted file mode 100644 index a6785f886..000000000 --- a/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/test/java/org/joyqueue/client/loadbalance/adaptive/AvailableScoreJudgeTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.joyqueue.client.loadbalance.adaptive; - -import org.joyqueue.client.loadbalance.adaptive.judge.AvailableScoreJudge; -import org.joyqueue.client.loadbalance.adaptive.node.Metric; -import org.joyqueue.client.loadbalance.adaptive.node.Node; -import org.joyqueue.client.loadbalance.adaptive.node.Nodes; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mockito; - -import java.util.Arrays; - -/** - * TPSScoreJudgeTest - * author: gaohaoxiang - * date: 2020/8/10 - */ -public class AvailableScoreJudgeTest { - - private Nodes nodes; - private Node node1; - private Node node2; - private Node node3; - private AvailableScoreJudge availableScoreJudge; - - @Before - public void before() { - availableScoreJudge = new AvailableScoreJudge(); - - node1 = Mockito.mock(Node.class); - Mockito.when(node1.getMetric()).thenReturn(Mockito.mock(Metric.class)); - Mockito.when(node1.getMetric().getErrorTps()).thenReturn(1L); - - node2 = Mockito.mock(Node.class); - Mockito.when(node2.getMetric()).thenReturn(Mockito.mock(Metric.class)); - Mockito.when(node2.getMetric().getErrorTps()).thenReturn(2L); - - node3 = Mockito.mock(Node.class); - Mockito.when(node3.getMetric()).thenReturn(Mockito.mock(Metric.class)); - Mockito.when(node3.getMetric().getErrorTps()).thenReturn(3L); - - nodes = Mockito.mock(Nodes.class); - Mockito.when(nodes.getMetric()).thenReturn(Mockito.mock(Metric.class)); - Mockito.when(nodes.getMetric().getErrorTps()).thenReturn(2l); - Mockito.when(nodes.getNodes()).thenReturn(Arrays.asList(node1, node2, node3)).getMock(); - } - - @Test - public void computeTest() { - double compute1 = availableScoreJudge.compute(nodes, node1); - double compute2 = availableScoreJudge.compute(nodes, node2); - double compute3 = availableScoreJudge.compute(nodes, node3); - - Assert.assertTrue(compute1 <= 100); - Assert.assertTrue(compute2 <= 100); - Assert.assertTrue(compute3 <= 100); -// Assert.assertTrue((compute1 > compute2) && (compute2 >= compute3)); - } -} \ No newline at end of file diff --git a/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/test/java/org/joyqueue/client/loadbalance/adaptive/RegionScoreJudgeTest.java b/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/test/java/org/joyqueue/client/loadbalance/adaptive/RegionScoreJudgeTest.java deleted file mode 100644 index 920a26b29..000000000 --- a/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/test/java/org/joyqueue/client/loadbalance/adaptive/RegionScoreJudgeTest.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.joyqueue.client.loadbalance.adaptive; - -import org.joyqueue.client.loadbalance.adaptive.judge.RegionScoreJudge; -import org.joyqueue.client.loadbalance.adaptive.node.Metric; -import org.joyqueue.client.loadbalance.adaptive.node.Node; -import org.joyqueue.client.loadbalance.adaptive.node.Nodes; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mockito; - -import java.util.Arrays; - -/** - * TP99ScoreJudgeTest - * author: gaohaoxiang - * date: 2020/8/10 - */ -public class RegionScoreJudgeTest { - - private Nodes nodes; - private Node node1; - private Node node2; - private Node node3; - private RegionScoreJudge regionScoreJudge; - - @Before - public void before() { - regionScoreJudge = new RegionScoreJudge(); - - node1 = Mockito.mock(Node.class); - Mockito.when(node1.isNearby()).thenReturn(true); - - node2 = Mockito.mock(Node.class); - Mockito.when(node2.isNearby()).thenReturn(true); - - node3 = Mockito.mock(Node.class); - Mockito.when(node3.isNearby()).thenReturn(false); - - nodes = Mockito.mock(Nodes.class); - Mockito.when(nodes.getMetric()).thenReturn(Mockito.mock(Metric.class)); - Mockito.when(nodes.getNodes()).thenReturn(Arrays.asList(node1, node2, node3)).getMock(); - } - - @Test - public void computeTest() { - double compute1 = regionScoreJudge.compute(nodes, node1); - double compute2 = regionScoreJudge.compute(nodes, node2); - double compute3 = regionScoreJudge.compute(nodes, node3); - - Assert.assertTrue(compute1 <= 100); - Assert.assertTrue(compute2 <= 100); - Assert.assertTrue(compute3 <= 100); - Assert.assertTrue((compute1 == compute2) && (compute2 > compute3)); - } -} \ No newline at end of file diff --git a/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/test/java/org/joyqueue/client/loadbalance/adaptive/TP99ScoreJudgeTest.java b/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/test/java/org/joyqueue/client/loadbalance/adaptive/TP99ScoreJudgeTest.java deleted file mode 100644 index f321f525e..000000000 --- a/joyqueue-client/joyqueue-client-loadbalance-adaptive/src/test/java/org/joyqueue/client/loadbalance/adaptive/TP99ScoreJudgeTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.joyqueue.client.loadbalance.adaptive; - -import org.joyqueue.client.loadbalance.adaptive.judge.TP99ScoreJudge; -import org.joyqueue.client.loadbalance.adaptive.node.Metric; -import org.joyqueue.client.loadbalance.adaptive.node.Node; -import org.joyqueue.client.loadbalance.adaptive.node.Nodes; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mockito; - -import java.util.Arrays; - -/** - * TP99ScoreJudgeTest - * author: gaohaoxiang - * date: 2020/8/10 - */ -public class TP99ScoreJudgeTest { - - private Nodes nodes; - private Node node1; - private Node node2; - private Node node3; - private TP99ScoreJudge tp99ScoreJudge; - - @Before - public void before() { - tp99ScoreJudge = new TP99ScoreJudge(); - - node1 = Mockito.mock(Node.class); - Mockito.when(node1.getMetric()).thenReturn(Mockito.mock(Metric.class)); - Mockito.when(node1.getMetric().getTp99()).thenReturn(0.1); - - node2 = Mockito.mock(Node.class); - Mockito.when(node2.getMetric()).thenReturn(Mockito.mock(Metric.class)); - Mockito.when(node2.getMetric().getTp99()).thenReturn(0.2); - - node3 = Mockito.mock(Node.class); - Mockito.when(node3.getMetric()).thenReturn(Mockito.mock(Metric.class)); - Mockito.when(node3.getMetric().getTp99()).thenReturn(0.3); - - nodes = Mockito.mock(Nodes.class); - Mockito.when(nodes.getMetric()).thenReturn(Mockito.mock(Metric.class)); - Mockito.when(nodes.getMetric().getTp99()).thenReturn(0.2); - Mockito.when(nodes.getNodes()).thenReturn(Arrays.asList(node1, node2, node3)).getMock(); - } - - @Test - public void computeTest() { - double compute1 = tp99ScoreJudge.compute(nodes, node1); - double compute2 = tp99ScoreJudge.compute(nodes, node2); - double compute3 = tp99ScoreJudge.compute(nodes, node3); - - Assert.assertTrue(compute1 <= 100); - Assert.assertTrue(compute2 <= 100); - Assert.assertTrue(compute3 <= 100); - Assert.assertTrue((compute1 > compute2) && (compute2 >= compute3)); - } -} \ No newline at end of file diff --git a/styles/checkstyle.xml b/styles/checkstyle.xml index ed99196b5..c90070d09 100644 --- a/styles/checkstyle.xml +++ b/styles/checkstyle.xml @@ -54,12 +54,12 @@ - - - - - - + + + + + +