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);
   }
 }