코딩 하는 가든

Java - Java에서 Throttle기법 사용 하기. 본문

Java

Java - Java에서 Throttle기법 사용 하기.

가든리 2021. 4. 30. 17:12

들어가기에 앞서 먼저 Throttle(쓰로틀)이란?

쓰로틀은 같은 이벤트가 짧은 시간 내에 반복적으로 일어 날 때 부하를 막기 위해 호출 횟수의 제어를 하는 기법입니다.

주로 프론트엔드에서는 스크롤을 올리고 내릴 때, 스크롤에 붙어 있는 이벤트가 짧은 시간 내 엄청나게 많이 호출 되는 것을 방지하여 정해 진 시간 내에 정해진 횟수만큼 실행 될 수 있도록 제어하기 위해 쓰로틀 기법을 많이들 사용 합니다.

[www.zerocho.com/category/JavaScript/post/59a8e9cb15ac0000182794fa]

 

Java로 Throttle을 사용 하는 경우?

사실 잘 모르겠습니다 ㅎㅎ.

저 같은 경우엔 Spring 백엔드 서버에서 외부 api의 응답 결과를 캐시에 저장 하는 작업을 하는데, 반복적으로 같은 값들이 계속 저장 되기 때문에 매번 저장할 필요 없이 초당 횟수를 제한하여 저장 하면 좋지 않을까? 라는 생각이 들어 자바로 쓰로틀링을 구현하는 방법에 대해 찾아 보았습니다. 아마 여기까지 찾아 오신분들이라면 각자의 이유가 있을것이라고 생각 합니다...

 

구현

쓰로틀링을 구현한 라이브러리가 몇 가지 있지만 여기서는 google에서 만든 guava 라이브러리를 사용해 보겠습니다. 사실 guava는 많이 사용 하던 라이브러리 인데 쓰로틀 같은것 까지 구현 되어 있을 줄은 몰랐습니다.

 

1. 먼저 구아바 라이브러리 의존성을 추가 해 줍니다. (최신 버전은 여기서 확인 가능 합니다.)

dependencies {
    implementation 'com.google.guava:guava:30.1.1-jre'
}

 

2. RateLimiter 객체를 만들어 줍니다.

    create 메소드의 인자는 double permitsPerSecond 인데 초당 몇 회까지 호출 할 수 있는가에 대한 값 입니다.

 

3. 쓰로틀링을 사용하고 싶은 로직을 if(rateLimiter.tryAcquire()) 로 감쌉니다.

RateLimiter rateLimiter = RateLimiter.create(2);

public void throttleMethod() {
	if (rateLimiter.tryAcquire()) {
		System.out.println("hello, world!");
	}
}

위와 같이 코드를 작성 하면 throttleMethod 내의 프린트는 최대 1초에 2회 찍히게 됩니다.

 

 

전체적인 코드는 아래와 같이 생겼습니다.

초당 최대 2회를 부를 수 있게 했고 5초동안 루프를 돌며 호출을 해봤습니다.

초당 2회씩 5초동안이면 10번이 호출 될 것 입니다.

 

결과

 

몇 줄 없지만 전체 코드는 깃허브에서 확인 가능합니다.

github.com/97e57e/BLOG/tree/master/Java/throttle