Spring Boot - Async 심화
SimpleAsyncTaskExecutor
는 Thread Pool이 아니다.
SimpleAsyncTaskExecutor
는 단순히 Thread를 계속 만들어내는 객체이다. Thread는 자원이 많이 들기 때문에 가급적이면 Thread Pool 관리하에 사용이 되어야 한다.
그렇다면, 이를 확인해보자. 일단 가시화를 해보기 위해 **VisualVM**을 사용해보고자 한다.
설정
기본적인 설정은 Spring Boot - Async에서 간략하게 다뤄봤다. 보다 자세한 내용을 원한다면 공식 문서나 가이드를 참고하기를 권장한다.
SimpleAsyncTaskExecutor
Bean 등록
@Override
public Executor getAsyncExecutor() {
return new SimpleAsyncTaskExecutor("heowc-async-");
}
가시화
테스트는 10번의 HTTP 호출해본다. 당연한 결과이지만 앞서 말한바와 같이 10개의 Thread가 생성된 것을 볼 수 있다.
Custom Thread Pool
그렇다면 Thread Pool을 만들면 어떤 결과가 나오게 될까?
Bean 등록
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(2);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(500);
executor.setThreadNamePrefix("heowc-async-");
executor.initialize();
return executor;
}
가시화
앞서 했던 테스트와 동일하게 진행 했다. 결과는 10개 보다 작은 Thread를 생성하게 된다.
AsyncRestTemplate
AsyncRestTemplate
는 RestTemplate
를 비동기로 처리하기 위한 방법이다. (Spring 5에서는 deprecated되었고 WebClient
를 사용해야 한다.)
AsyncRestTemplate
또한 Async와 동일하게 SimpleAsyncTaskExecutor
를 기본적으로 사용한다. 물론 Thread Pool를 만들어주는 것도 좋지만, AsyncRestTemplate
를 보다 효율적으로 사용하기 위해서는 NIO 라이브러리를 사용하는 것이 좋다.
Dependency
NIO 라이브러리는 Apache와 Netty에서 제공한다.
dependencies {
compile('org.apache.httpcomponents:httpasyncclient:4.1.3')
compile('io.netty:netty-all:4.1.11.Final')
}
Config
Apache에서 제공해주는 것은 HttpCoponentsAsyncClientHttpRequestFactory
를 사용하면 되고, Netty에서 제공해주는 것은 Netty4ClientHttpRequestFactory
를 이용하면 된다.
@Bean
public AsyncRestTemplate asyncRestTemplate() {
// return new AsyncRestTemplate(new Netty4ClientHttpRequestFactory());
return new AsyncRestTemplate(new HttpComponentsAsyncClientHttpRequestFactory());
}
가시화
SimpleAsyncTaskExecutor
사용
HttpCoponentsAsyncClientHttpRequestFactory
사용