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 fa05355cf9c7a2f76543415eec94d7882201db09 Author: liubao <[email protected]> AuthorDate: Fri Jun 17 09:31:59 2022 +0800 [SCB-2578]instance pull should avoid too many queued events --- .../center/client/ServiceCenterDiscovery.java | 20 +++++++++++++++++++- .../governance/handler/InstanceIsolationHandler.java | 2 +- 2 files changed, 20 insertions(+), 2 deletions(-) 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 f0c267330..6b5578e4e 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 @@ public class ServiceCenterDiscovery extends AbstractTask { private static final String ALL_VERSION = "0+"; + private static volatile boolean pullInstanceTaskOnceInProgress = false; + public static class SubscriptionKey { final String appId; @@ -144,7 +146,12 @@ public class ServiceCenterDiscovery extends AbstractTask { @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 @@ public class ServiceCenterDiscovery extends AbstractTask { } } + 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 85afecdd5..8ab3333b2 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.github.resilience4j.micrometer.tagged.TaggedCircuitBreakerMetrics; 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";
