This is an automated email from the ASF dual-hosted git repository. liubao pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git
commit c3721c83b82a1e837a0d533ee41a8b5c7e138454 Author: zyl <[email protected]> AuthorDate: Wed Jan 13 17:10:00 2021 +0800 SCB-2178 Improve algorithm of loadBalance strage WeightedResponse --- .../TestWeightedResponseTimeRuleExt.java | 57 ++++++++++++---------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestWeightedResponseTimeRuleExt.java b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestWeightedResponseTimeRuleExt.java index 3b21a70..b8d03bc 100644 --- a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestWeightedResponseTimeRuleExt.java +++ b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestWeightedResponseTimeRuleExt.java @@ -17,15 +17,15 @@ package org.apache.servicecomb.loadbalance; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - import org.apache.servicecomb.core.Invocation; import org.junit.Assert; import org.junit.Test; import org.mockito.Mockito; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + public class TestWeightedResponseTimeRuleExt { @Test public void testRoundRobin() { @@ -58,40 +58,47 @@ public class TestWeightedResponseTimeRuleExt { LoadBalancer loadBalancer = new LoadBalancer(rule, "testService"); List<ServiceCombServer> servers = new ArrayList<>(); Invocation invocation = Mockito.mock(Invocation.class); - for (int i = 0; i < 2; i++) { - ServiceCombServer server = Mockito.mock(ServiceCombServer.class); - Mockito.when(server.toString()).thenReturn("server " + i); - servers.add(server); - loadBalancer.getLoadBalancerStats().noteResponseTime(server, 20 * Math.pow(20, i + 1)); - } - AtomicInteger server1 = new AtomicInteger(0); - AtomicInteger server2 = new AtomicInteger(0); + ServiceCombServer server1 = Mockito.mock(ServiceCombServer.class); + Mockito.when(server1.toString()).thenReturn("server " + 0); + servers.add(server1); + ServiceCombServer server2 = Mockito.mock(ServiceCombServer.class); + Mockito.when(server2.toString()).thenReturn("server " + 1); + servers.add(server2); + + AtomicInteger serverCounter1 = new AtomicInteger(0); + AtomicInteger serverCounter2 = new AtomicInteger(0); for (int i = 0; i < 1000; i++) { + loadBalancer.getLoadBalancerStats().noteResponseTime(server1, 20); + loadBalancer.getLoadBalancerStats().noteResponseTime(server2, 400); + Thread.sleep(1); if (rule.choose(servers, invocation).toString().equals("server 0")) { - server1.incrementAndGet(); + serverCounter1.incrementAndGet(); } else { - server2.incrementAndGet(); + serverCounter2.incrementAndGet(); } - //此处是为了控制请求的时间窗口大小,使得策略中1分钟大小的时间窗口生效,并产生变化 - Thread.sleep(1); } - double percent = (double) server1.get() / (server2.get() + server1.get()); + double percent = (double) serverCounter1.get() / (serverCounter2.get() + serverCounter1.get()); System.out.println("percent" + percent); - Assert.assertEquals("actually percent: " + percent, 0.70d < percent, percent < 0.90d); - server1.set(0); - server2.set(0); - Thread.sleep(1000); + Assert.assertTrue(percent > 0.60d); + Assert.assertTrue(percent < 0.90d); + serverCounter1.set(0); + serverCounter2.set(0); + + Thread.sleep(2000); for (int i = 0; i < 1000; i++) { + loadBalancer.getLoadBalancerStats().noteResponseTime(server1, 20); + loadBalancer.getLoadBalancerStats().noteResponseTime(server2, 20); + Thread.sleep(1); if (rule.choose(servers, invocation).toString().equals("server 0")) { - server1.incrementAndGet(); + serverCounter1.incrementAndGet(); } else { - server2.incrementAndGet(); + serverCounter2.incrementAndGet(); } } - percent = (double) server1.get() / (server2.get() + server1.get()); + percent = (double) serverCounter1.get() / (serverCounter2.get() + serverCounter1.get()); System.out.println("percent" + percent); - Assert.assertEquals(0.50d, percent, 0); + Assert.assertEquals(0.50d, percent, 0.2); } @Test
