Token Bucket알고리즘의 아이디어 위에 구현된 rate limit 라이브러리 입니다. io.github.bucket4j.Bucket 인터페이스로 표시 됩니다.
Token Bucket 알고리즘은 쉽게 말해서 패킷에 토큰을 심어놨다가 요청이 들어올때마다 하나씩 줄여서 0이 되면 요청을 거부하도록 하는 알고리즘인것 같습니다.
bucket은 다음과같이 빌더로 객체를 구성할 수 있다.
Bucket bucket = Bucket.builder()
.addLimit(...)
.build();
BucketConfiguration은 작업중에 BucketBuilder는 백그라운드에서 자동으로 수행되기 때문에 BucketConfiguration를 직접 생성해선 안된다.
Bandwidth bandwidth = Bandwidth.simple(42, Duration.ofMinutes(1))
.withInitialTokens(13);
BucketConfiguration configuration = BucketConfiguration.builder()
.addLimit(Bandwidth.simple(1000, Duration.ofMinutes(1)).withId("business-limit"))
.addLimit(Bandwidth.simple(100, Duration.ofSeconds(1)).withId("burst-protection"))
.build();
// 아래 두 줄의 코드는 완전히 동일합니다.
Bandwidth.simple(100, Duration.ofMinutes(1))
Bandwidth.classic(100, Refill.greedy(100, Duration.ofMinutes(1)))
// 분당 100개 토큰 생성
Refill.intervally(100, Duration.ofMinutes(1));
// 현제 시간이 16:20이라고 가정하고 첫 번째 리필은 17:00에 발생합니다.
// 첫 번째 리필은 다음 시간 초에 발생합니다.
Instant firstRefillTime = ZonedDateTime.now()
.truncatedTo(ChronoUnit.HOURS)
.plus(1, ChronoUnit.HOURS)
.toInstant();
Bandwidth.classic(400, Refill.intervallyAligned(400, Duration.ofHours(1), firstRefillTime, true));
BucketState는 버킷이 다음과 같이 변경 가능한 자체 상태를 저장하는 곳입니다.
사용자가 직접 생성자를 통해 라이브러리의 객체를 구성하지 않도록 라이브러리 작성자가 명시적으로 결정한 결과물
그렇게 한이유는
Bucket bucket = Bucket.builder()
.addLimit(Bandwidth.simple())
.withNanosecondPrecision()
.withSynchronizationStrategy(SynchronizationStrategy.LOCK_FREE)
.build()
참고 : 8.x 버전부터 java8에서 java11로 마이그래이션함