You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2018/07/16 06:25:36 UTC
[incubator-servicecomb-java-chassis] 06/11: [SCB-706]add ping to
instances to check status
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/incubator-servicecomb-java-chassis.git
commit e8a2eaac38b52360a78ba415ff5176a9fa30202b
Author: liubao <ba...@huawei.com>
AuthorDate: Thu Jul 12 15:13:16 2018 +0800
[SCB-706]add ping to instances to check status
---
.../loadbalance/ServiceCombLoadBalancerStats.java | 30 ++++++++++++++++++++++
.../TestServiceCombLoadBalancerStats.java | 15 +++++++++++
2 files changed, 45 insertions(+)
diff --git a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombLoadBalancerStats.java b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombLoadBalancerStats.java
index 2efc042..7e69eec 100644
--- a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombLoadBalancerStats.java
+++ b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombLoadBalancerStats.java
@@ -17,10 +17,16 @@
package org.apache.servicecomb.loadbalance;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Timer;
+import java.util.TimerTask;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
+import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
+import org.apache.servicecomb.serviceregistry.consumer.MicroserviceInstancePing;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -38,6 +44,8 @@ public class ServiceCombLoadBalancerStats {
private static final int SERVERSTATS_EXPIRE_MINUTES = 30;
+ private static final long TIMER_INTERVAL_MILLIS = 10000;
+
private static final LoadingCache<ServiceCombServer, ServiceCombServerStats> SERVER_STATES_CACHE =
CacheBuilder.newBuilder()
.expireAfterAccess(SERVERSTATS_EXPIRE_MINUTES, TimeUnit.MINUTES)
@@ -57,7 +65,29 @@ public class ServiceCombLoadBalancerStats {
public static final ServiceCombLoadBalancerStats INSTANCE = new ServiceCombLoadBalancerStats();
private ServiceCombLoadBalancerStats() {
+ Timer timer = new Timer("LoadBalancerStatsTimer", true);
+ timer.schedule(new TimerTask() {
+ private MicroserviceInstancePing ping = SPIServiceUtils.getPriorityHighestService(MicroserviceInstancePing.class);
+ @Override
+ public void run() {
+ try {
+ Map<ServiceCombServer, ServiceCombServerStats> allServers = SERVER_STATES_CACHE.asMap();
+ Iterator<ServiceCombServer> instances = allServers.keySet().iterator();
+ while (instances.hasNext()) {
+ ServiceCombServer server = instances.next();
+ // will not cause reload
+ ServiceCombServerStats stats = allServers.get(server);
+ if ((System.currentTimeMillis() - stats.getLastVisitTime() < TIMER_INTERVAL_MILLIS) && !ping
+ .ping(server.getInstance())) {
+ markFailure(server);
+ }
+ }
+ } catch (Throwable e) {
+ LOGGER.warn("LoadBalancerStatsTimer error.", e);
+ }
+ }
+ }, TIMER_INTERVAL_MILLIS, TIMER_INTERVAL_MILLIS);
}
public void markSuccess(ServiceCombServer server) {
diff --git a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombLoadBalancerStats.java b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombLoadBalancerStats.java
index a5109b7..0d91690 100644
--- a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombLoadBalancerStats.java
+++ b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombLoadBalancerStats.java
@@ -83,5 +83,20 @@ public class TestServiceCombLoadBalancerStats {
ServiceCombLoadBalancerStats.INSTANCE.getServiceCombServerStats(instance).getLastVisitTime() <= System
.currentTimeMillis()
&& ServiceCombLoadBalancerStats.INSTANCE.getServiceCombServerStats(instance).getLastVisitTime() >= time);
+
+ // time consuming test for timers, taking about 20 seconds. ping timer will update instance status to failure
+ Assert.assertTrue(ServiceCombLoadBalancerStats.INSTANCE.getServiceCombServerStats(instance).getFailedRate() <= 50);
+ long beginTime = System.currentTimeMillis();
+ long rate = ServiceCombLoadBalancerStats.INSTANCE.getServiceCombServerStats(instance).getFailedRequests();
+ while (rate <= 20 &&
+ System.currentTimeMillis() - beginTime <= 30000) {
+ Thread.sleep(2000);
+ rate = ServiceCombLoadBalancerStats.INSTANCE.getServiceCombServerStats(instance).getFailedRequests();
+ System.out.println("XXXTTTTT1" + rate);
+ }
+
+ Assert.assertTrue(System.currentTimeMillis() - beginTime < 30000);
+ Assert
+ .assertTrue(ServiceCombLoadBalancerStats.INSTANCE.getServiceCombServerStats(instance).getFailedRequests() > 20);
}
}