Rework MaxMind circuit breaker
This commit is contained in:
parent
5f322824ac
commit
eb03636a6b
@ -8,12 +8,14 @@ import io.vertx.core.http.HttpClient;
|
|||||||
import io.vertx.core.http.HttpClientOptions;
|
import io.vertx.core.http.HttpClientOptions;
|
||||||
import io.vertx.core.json.JsonObject;
|
import io.vertx.core.json.JsonObject;
|
||||||
import lombok.experimental.UtilityClass;
|
import lombok.experimental.UtilityClass;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import net.frozenorb.apiv3.APIv3;
|
import net.frozenorb.apiv3.APIv3;
|
||||||
import net.frozenorb.apiv3.maxmind.MaxMindResult;
|
import net.frozenorb.apiv3.maxmind.MaxMindResult;
|
||||||
|
|
||||||
import java.util.Base64;
|
import java.util.Base64;
|
||||||
|
|
||||||
@UtilityClass
|
@UtilityClass
|
||||||
|
@Slf4j
|
||||||
public class MaxMindUtils {
|
public class MaxMindUtils {
|
||||||
|
|
||||||
private static final String maxMindUserId = APIv3.getConfig().getProperty("maxMind.userId");
|
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(),
|
breaker = CircuitBreaker.create("maxmind-circuit-breaker", APIv3.getVertxInstance(),
|
||||||
new CircuitBreakerOptions()
|
new CircuitBreakerOptions()
|
||||||
.setMaxFailures(5)
|
.setMaxFailures(5)
|
||||||
.setTimeout(1000) // 1 second
|
.setTimeout(5000) // 5 secondS
|
||||||
.setFallbackOnFailure(true)
|
.setFallbackOnFailure(true)
|
||||||
.setResetTimeout(120_000) // 2 minutes
|
.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<MaxMindResult> callback) {
|
public static void getInsights(String ip, SingleResultCallback<MaxMindResult> callback) {
|
||||||
breaker.executeWithFallback((future) -> {
|
breaker.execute((future) -> {
|
||||||
String authHeader = "Basic " + Base64.getEncoder().encodeToString((maxMindUserId + ":" + maxMindLicenseKey).getBytes(Charsets.UTF_8));
|
String authHeader = "Basic " + Base64.getEncoder().encodeToString((maxMindUserId + ":" + maxMindLicenseKey).getBytes(Charsets.UTF_8));
|
||||||
|
|
||||||
httpsClient.get(443, "geoip.maxmind.com", "/geoip/v2.1/insights/" + ip, (response) -> {
|
httpsClient.get(443, "geoip.maxmind.com", "/geoip/v2.1/insights/" + ip, (response) -> {
|
||||||
@ -52,14 +58,14 @@ public class MaxMindUtils {
|
|||||||
|
|
||||||
response.exceptionHandler((error) -> {
|
response.exceptionHandler((error) -> {
|
||||||
// we have to check !failed because the circuit breaker's timeout will mark us as failed already
|
// 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);
|
future.fail(error);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
.putHeader("Authorization", authHeader)
|
.putHeader("Authorization", authHeader)
|
||||||
.end();
|
.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()) {
|
if (result.failed()) {
|
||||||
callback.onResult(null, result.cause());
|
callback.onResult(null, result.cause());
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user