Use long instead of int for rate limiter permits

This commit is contained in:
Jon Chambers
2025-12-08 10:02:20 -05:00
committed by Jon Chambers
parent 77d04ccb70
commit 5f25b6a412
7 changed files with 26 additions and 29 deletions

View File

@@ -68,7 +68,7 @@ public class LeakyBucketRateLimiter implements RateLimiter {
}
@Override
public void validate(final String key, final int amount) throws RateLimitExceededException {
public void validate(final String key, final long amount) throws RateLimitExceededException {
final RateLimiterConfig config = config();
try {
final long deficitPermitsAmount = executeValidateScript(config, key, amount, true);
@@ -90,7 +90,7 @@ public class LeakyBucketRateLimiter implements RateLimiter {
}
@Override
public CompletionStage<Void> validateAsync(final String key, final int amount) {
public CompletionStage<Void> validateAsync(final String key, final long amount) {
final RateLimiterConfig config = config();
return executeValidateScriptAsync(config, key, amount, true)
@@ -117,7 +117,7 @@ public class LeakyBucketRateLimiter implements RateLimiter {
}
@Override
public boolean hasAvailablePermits(final String key, final int permits) {
public boolean hasAvailablePermits(final String key, final long permits) {
final RateLimiterConfig config = config();
try {
final long deficitPermitsAmount = executeValidateScript(config, key, permits, false);
@@ -132,7 +132,7 @@ public class LeakyBucketRateLimiter implements RateLimiter {
}
@Override
public CompletionStage<Boolean> hasAvailablePermitsAsync(final String key, final int amount) {
public CompletionStage<Boolean> hasAvailablePermitsAsync(final String key, final long amount) {
final RateLimiterConfig config = config();
return executeValidateScriptAsync(config, key, amount, false)
.thenApply(deficitPermitsAmount -> deficitPermitsAmount == 0)
@@ -162,7 +162,7 @@ public class LeakyBucketRateLimiter implements RateLimiter {
return configResolver.get();
}
private long executeValidateScript(final RateLimiterConfig config, final String key, final int amount, final boolean applyChanges) {
private long executeValidateScript(final RateLimiterConfig config, final String key, final long amount, final boolean applyChanges) {
final List<String> keys = List.of(bucketName(name, key));
final List<String> arguments = List.of(
String.valueOf(config.bucketSize()),
@@ -174,7 +174,7 @@ public class LeakyBucketRateLimiter implements RateLimiter {
return (Long) validateScript.execute(keys, arguments);
}
private CompletionStage<Long> executeValidateScriptAsync(final RateLimiterConfig config, final String key, final int amount, final boolean applyChanges) {
private CompletionStage<Long> executeValidateScriptAsync(final RateLimiterConfig config, final String key, final long amount, final boolean applyChanges) {
final List<String> keys = List.of(bucketName(name, key));
final List<String> arguments = List.of(
String.valueOf(config.bucketSize()),

View File

@@ -13,13 +13,13 @@ import reactor.core.publisher.Mono;
public interface RateLimiter {
void validate(String key, int amount) throws RateLimitExceededException;
void validate(String key, long amount) throws RateLimitExceededException;
CompletionStage<Void> validateAsync(String key, int amount);
CompletionStage<Void> validateAsync(String key, long amount);
boolean hasAvailablePermits(String key, int permits);
boolean hasAvailablePermits(String key, long permits);
CompletionStage<Boolean> hasAvailablePermitsAsync(String key, int amount);
CompletionStage<Boolean> hasAvailablePermitsAsync(String key, long amount);
void clear(String key);
@@ -35,7 +35,7 @@ public interface RateLimiter {
validate(accountUuid.toString());
}
default void validate(final UUID accountUuid, final int permits) throws RateLimitExceededException {
default void validate(final UUID accountUuid, final long permits) throws RateLimitExceededException {
validate(accountUuid.toString(), permits);
}
@@ -63,11 +63,11 @@ public interface RateLimiter {
return validateReactive(accountUuid.toString());
}
default boolean hasAvailablePermits(final UUID accountUuid, final int permits) {
default boolean hasAvailablePermits(final UUID accountUuid, final long permits) {
return hasAvailablePermits(accountUuid.toString(), permits);
}
default CompletionStage<Boolean> hasAvailablePermitsAsync(final UUID accountUuid, final int permits) {
default CompletionStage<Boolean> hasAvailablePermitsAsync(final UUID accountUuid, final long permits) {
return hasAvailablePermitsAsync(accountUuid.toString(), permits);
}

View File

@@ -9,7 +9,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.AssertTrue;
import java.time.Duration;
public record RateLimiterConfig(int bucketSize, Duration permitRegenerationDuration, boolean failOpen) {
public record RateLimiterConfig(long bucketSize, Duration permitRegenerationDuration, boolean failOpen) {
public double leakRatePerMillis() {
return 1.0 / (permitRegenerationDuration.toNanos() / 1e6);