From eb03636a6b673807103cf636ec35b59b74d62fef Mon Sep 17 00:00:00 2001 From: Colin McDonald Date: Sat, 16 Jul 2016 22:57:09 -0400 Subject: [PATCH] Rework MaxMind circuit breaker --- .../net/frozenorb/apiv3/util/MaxMindUtils.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/frozenorb/apiv3/util/MaxMindUtils.java b/src/main/java/net/frozenorb/apiv3/util/MaxMindUtils.java index fe6fb97..3866fe4 100644 --- a/src/main/java/net/frozenorb/apiv3/util/MaxMindUtils.java +++ b/src/main/java/net/frozenorb/apiv3/util/MaxMindUtils.java @@ -8,12 +8,14 @@ import io.vertx.core.http.HttpClient; import io.vertx.core.http.HttpClientOptions; import io.vertx.core.json.JsonObject; import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; import net.frozenorb.apiv3.APIv3; import net.frozenorb.apiv3.maxmind.MaxMindResult; import java.util.Base64; @UtilityClass +@Slf4j public class MaxMindUtils { private static final String maxMindUserId = APIv3.getConfig().getProperty("maxMind.userId"); @@ -28,14 +30,18 @@ public class MaxMindUtils { breaker = CircuitBreaker.create("maxmind-circuit-breaker", APIv3.getVertxInstance(), new CircuitBreakerOptions() .setMaxFailures(5) - .setTimeout(1000) // 1 second + .setTimeout(5000) // 5 secondS .setFallbackOnFailure(true) .setResetTimeout(120_000) // 2 minutes ); + breaker.fallback((ignored) -> null); + breaker.openHandler((ignored) -> log.info("MaxMind circuit breaker is now open.")); + breaker.halfOpenHandler((ignored) -> log.info("MaxMind circuit breaker is now half-open.")); + breaker.closeHandler((ignored) -> log.info("MaxMind circuit breaker is now closed.")); } public static void getInsights(String ip, SingleResultCallback callback) { - breaker.executeWithFallback((future) -> { + breaker.execute((future) -> { String authHeader = "Basic " + Base64.getEncoder().encodeToString((maxMindUserId + ":" + maxMindLicenseKey).getBytes(Charsets.UTF_8)); httpsClient.get(443, "geoip.maxmind.com", "/geoip/v2.1/insights/" + ip, (response) -> { @@ -52,14 +58,14 @@ public class MaxMindUtils { response.exceptionHandler((error) -> { // we have to check !failed because the circuit breaker's timeout will mark us as failed already - if (!future.failed()) { + if (future.isComplete()) { future.fail(error); } }); }) .putHeader("Authorization", authHeader) .end(); - }, (ignored) -> null).setHandler((result) -> { // The (ignored) -> null section is our fallback, which just returns null (when the breaker is open) + }).setHandler((result) -> { if (result.failed()) { callback.onResult(null, result.cause()); } else {