Spring

Bucket4j란? Bucket4j를 사용한 Spring 트래픽 제한하기

히진 2022. 1. 4. 14:05
반응형

 

들어가기 앞서..

Spring REST API를 개발하며 특정 API들에 대해 일정시간 혹은 사용자마다 요청한도(트래픽)을 제한하고 싶은 경우가 있습니다. 해당 기능을 개발하기 위한 유용한 라이브러리인 Bucket4j를 소개하며 해당 라이브러리를 통한 유량제어에 대해 실습을 해보려고 합니다. (요청한도(트래픽) 제한을 하기 위한 라이브러리론 해당 라이브러리 외에 RateLimiter, RateLimitJ 등도 있으니 함께 알아보며 공부하면 더 좋을 것 같습니다.)

Bucket4J란?

Bucket4j는 Token bucket 알고리즘을 기반으로 하는 Java 속도 제한 라이브러리 입니다. Bucket4j는 독립 실행형 JVM 애플리케이션 또는 클러스터 환경에서 사용할 수 있는 스레드로부터 안전한 라이브러리입니다.

 

Bucket4J 개발하기

Bucket4J library

implementation group: 'com.github.vladimir-bukhtoyarov', name: 'bucket4j-core', version: '7.0.0'

https://mvnrepository.com/artifact/com.github.vladimir-bukhtoyarov/bucket4j-core

 

Bucket4J Class

Refill

해당 Class는 일정시간마다 몇개의 Token을 충전할지 지정하는 Class입니다

Bandwidth 

해당 Class는 Bucket의 총 크기를 지정하는 Class이며 앞서 Token 충전 주기 및 개수를 지정한 Refill Class를 사용하여 만듭니다.

Bucket  

해당 Class는 최종적으로 트래픽 제어를 할 Class이며 앞서 만든 Bandwidt Class를 사용하여 Build 합니다.

 

Bucket4J Example Source 1

Example Source 1 실행결과

Bucket4J Example Source 2

분당 5개 트래픽 제한이 있다고 가정합니다. 동시에, 10초 안에 모든 토큰을 소진시키는 트래픽을 피하고 싶을 수도 있습니다 . Bucket4j를 사용 하면 동일한 버킷에 여러 Limit를 설정할 수 있습니다. 10초 시간 창에 2개의 요청만 허용하는 또 다른 Limit를 추가해 보겠습니다.

Example Source 2 Result

 

Bucket4J로 Spring 트래픽 제한 개발하기

Bucket4J Spring Example Source 1

Bucket4J Spring Example Source 1 Result

 

Bucket4J로 API 클라이언트 요금제 개발하기

Bucket4J Spring Example Source 2 (API 클라이언트 요금제 개발하기)

API 클라이언트 요금제 Enum 

클라이언트 요금제를 Enum에 저장하여 해당 apiKey에 맞는 Bucket를 반환한다.

 

API 클라이언트 요금제 Service

apiKey별로 Bucket를 저장하고 apiKey에 맞는 버킷을 반환한다.

 

API 클라이언트 요금제 Controller

apiKey별로 시간마다 정해진 횟수만큼 사용 가능한 Controller입니다.

ConsumptionProbe Class내 Method 이용하여 해당 bucket의 남은 Token 및 재충전 시간등을 조회 가능합니다. 

해당 Method를 사용하여 고객 편의 양질의 서비스를 만들 수 있습니다.
ConsumptionProbe javadoc

 

 

Bucket4J Spring Example Source 2 Result

 

반응형