Post

ExecutorService로 Spring에서 병렬 처리와 스레드 수 제한하기

번역 API 측에서온 요청 (Thread 개수 제한)


번역 API 에서 요청사항이 들어왔다. 아쉽게도 자원문제 때문에 무한정 호출을 하지는 말고 병렬로 최대 5개의 Request 만 보내달라는 요청이었다. 그러니까 10명이 동시에 “안녕하세요” 를 영어로 번역해달라고 요청하면 5명 먼저 해주고 나머지 5명은 그 뒤에 순서대로 처리해 달라는 것이었다.

Executor Service


Executor Service 는 java 에서 멀티쓰레딩을 쉽게 다룰수 있도록 지원하는 패키지이다! 과거에 진행했던 completableFuture 과 비슷하지만 ExecutorService 는 쓰레드 개수를 우리가 조정 할 수 있다는 것에 아주 큰 장점이 있다.

우선 아래와 같이 class variable 로 선언해 준다.

1
ExecutorService executorService = Executors.newFixedThreadPool(5)

그 다음 Thread 로 실행하고 싶은 함수를 이렇게 Innerclass 로 선언 해 준다. 그리고 call 부분에 원하는 작업을 쓰면 된다. 이때 return 값이 없는 함수라면 Runnable 을 사용해도 좋다!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class TranslateAsync implements Callable<String> {
	private final String text;
	private final String target;
	private final String source;
	
	public TranslateAsync (String text, String target, String source) {
		this.text = text;
		this.target = target;
		this.source = source;
	}

	@Override
	public String call(){
		translationUtils.getTranslatedText(text, target, source);
	}
}

그다음에 자유롭게 해당 inner class 를 사용하면 된다. 아래와 같이 사용 할 수 있다.

1
2
3
4
5
6
7
8
puvlic String utransTranslate(String text, String target, String source) {
	try {
		TranslateAsync task = new TranslateAsync(text, target, source);
		Future<String> future = executorService.submit(task);
		return future.get(); // Return값이 나올때 까지 기다린다는 의미!
	} catch (Exception e) {
	}
}

기존 CompletableFuture 과 다른점


내 기준에서 다른 점은 completableFuture은 사용 할때 thread 개수를 제한하지 않고 사용했다. 개발중에 한번 Elastic Search 에 Indexing 작업을 한 document 마다 모두 completableFuture 로 요청했더니 개발서버도 힘들어하고 Elastic Search 도 힘들어하고 깜짝 놀랐던 기억이 있다. 하지만 ExecutorService 를 사용하면 손쉽게 내가 Thread 개수를 정하고 할 수 있기에 빠르지만 서버에는 최대한 무리가 없게 개발이 가능하다!!

This post is licensed under CC BY 4.0 by the author.

© 병욱. Some rights reserved.