파워노트

[spring] 비동기 처리 정리. 본문

spring boot

[spring] 비동기 처리 정리.

파워킴 2021. 4. 22. 19:57
반응형

spring camp 에서 토비님의 비동기 강좌 정리 입니다. 

 

1.  @Async 사용시 return Type

  • void
  • Future<T>
  • ListenableFuture<T>
  • CompletableFuture<T>

 

    > Future 

            get() 메소드를 통해  비동기 결과를 가져올 있다.

 

    > ListenableFuture

            리스너를 통해. 성공, 실패 결과를 처리 있음.

            기본자바에는 없고 spring 4.0 추가됨.

 

    > CompletableFuture

        자바 8 포함

        completableFuture 비동기 처리에 대한 처리가 지원

 

 

 

2.  Async 처리시에 

    기본Thread는 SimpleAsyncTaskExceutor  쓰레드가 하나 생성이후 사용되고 버려짐.

    쓰레드 풀이 아니므로 낭비임.

 

    결론부터 말하자면 쓰레드풀을 만들어서 써라.

 

 > Thread Pool 설정 사용

  >  실사용 )

@Configuration
@EnableAsync
public class AsyncThreadConfiguration{
    @Bean(name="asyncThreadPoolTaskExecutor")
    publicExecutorasyncThreadTaskExecutor(){
            ThreadPoolTaskExecutort  hreadPoolTaskExecutor = new ThreadPoolTaskExecutor();

            threadPoolTaskExecutor.setCorePoolSize(10);
            threadPoolTaskExecutor.setQueueCapacity(50);
            threadPoolTaskExecutor.setMaxPoolSize(100);   
            threadPoolTaskExecutor.setThreadNamePrefix("TASK-POOL");
            returnt hreadPoolTaskExecutor;

     }
}

50개의 @Async 메소드 호출이 동시에 일어나도 10개만 사용.

. 1 corepool 이상이 요청되면 (10개처리)

. 2. queue 먼저 쌓는다 ( 나머지 40 대기)

. 3. 그래도 감당이 안된다면 Maxpool 까지 늘림.

 

3. 비동기 스프링 MVC

 

 

    ..1 Controller return Callable 지원한다.

    ..2 WebAsyncTask 에서 timeout thread 지정할수 있다..

    ..3 DeferedResult 지연결과처리 공장히 유용. thread 이미 반환하고 채널만 연결해놓고

        대기상태에서 응답이 오면 결과를 쓰면 .

                                             @Async 보통 같이 사용.

        ..4 ListenableFuture  :  DeferedResult + ListenableFuture => 좀더 간편하게 사용.      

 

      ..5 CompletableFuture : ListenableFuture callback hell 어려움 개선. 비동기 동시 조합, 결합 가능

 

4. 비동기 논블로킹 API 호출

    ..1 RestTemplate 동기-블로킹 방식 : 비효율…  쓰레드 점유함.

100초 걸림

    ..2 AsyncRestTemplate : 비동기 처리 가능

        AsyncRestTemplate 처리 listenableFuture 반환하여 처리.

1 초만에   수행함 .  그러나   쓰레드  100 개   생성됨 .   논블록킹이긴   하나   논블록킹  IO 를   사용하지   않음 .

   ..3 논블록킹 IO 지원하는 라이브러리 사용 Netty

                                             

쓰레드  1 개사용 .

5. AsyncRestTemplate 여러개의 비동기처리를 동시 조합은 어떻게 해야 할까?

                            AsyncRestTemplate + ListenableFuture 콜백 지옥

                             ==> AsyncRestTemplate + CompletableFuture 변경 처리하여 가능

 

 

 

6. 정리하면…

 

반응형
Comments