[SCB-2578]instance pull should avoid too many queued events
diff --git a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterDiscovery.java b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterDiscovery.java
index f0c2673..6b5578e 100644
--- a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterDiscovery.java
+++ b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterDiscovery.java
@@ -45,6 +45,8 @@
private static final String ALL_VERSION = "0+";
+ private static volatile boolean pullInstanceTaskOnceInProgress = false;
+
public static class SubscriptionKey {
final String appId;
@@ -144,7 +146,12 @@
@Subscribe
public void onPullInstanceEvent(PullInstanceEvent event) {
- pullAllInstance();
+ // to avoid too many pulls queued.
+ if (pullInstanceTaskOnceInProgress) {
+ return;
+ }
+ pullInstanceTaskOnceInProgress = true;
+ startTask(new PullInstanceOnceTask());
}
private void pullInstance(SubscriptionKey k, SubscriptionValue v) {
@@ -205,6 +212,17 @@
}
}
+ class PullInstanceOnceTask implements Task {
+ @Override
+ public void execute() {
+ try {
+ pullAllInstance();
+ } finally {
+ pullInstanceTaskOnceInProgress = false;
+ }
+ }
+ }
+
private synchronized void pullAllInstance() {
instancesCache.forEach((k, v) -> {
pullInstance(k, v);
diff --git a/governance/src/main/java/org/apache/servicecomb/governance/handler/InstanceIsolationHandler.java b/governance/src/main/java/org/apache/servicecomb/governance/handler/InstanceIsolationHandler.java
index 85afecd..8ab3333 100644
--- a/governance/src/main/java/org/apache/servicecomb/governance/handler/InstanceIsolationHandler.java
+++ b/governance/src/main/java/org/apache/servicecomb/governance/handler/InstanceIsolationHandler.java
@@ -34,7 +34,7 @@
import io.micrometer.core.instrument.MeterRegistry;
public class InstanceIsolationHandler extends AbstractGovernanceHandler<CircuitBreaker, CircuitBreakerPolicy> {
- private static final Logger LOGGER = LoggerFactory.getLogger(CircuitBreakerHandler.class);
+ private static final Logger LOGGER = LoggerFactory.getLogger(InstanceIsolationHandler.class);
private static final String DEFAULT_SERVICE_NAME = "default";