스프링 리액티브 프로그래밍,4편 (자바와 스프링의 비동기 기술)

박주진·2021년 8월 11일
0

스프링 리액티브

목록 보기
4/4

해당 포스팅은 토비님의 스프링 리액티브 프로그램밍 라이브 코딩 동영상을 기반으로 내용을 바탕으로 정리한 글입니다.

자바의 비동기 기술

  • future
    • 자바 1.5에 추가된 기술로써 비동기 계산 결과를 나타내는 interface
    • 별도의 스레드에서 실행시킨(비동기) 작업의 결과값을 전달하기 위한 inteface
    • future를 통해 결과값을 가져오기 위해서는 get메서드를 사용한다. 하지만 get메서드는 비동기 작업이 완료되기 전까지 쓰레드가 Blocking된다.
  • futureTask
    • future과 마찬가지로 비동기 작업을 위해 사용된다. 하지만 비동기 작업생성과 실행을 분리 할 수 있다.
    • 결과를 가져오는 방법은 2가지이다. callback 방식과 Future과 같이 직접 결과 값을 가져온는 방법이 있다.

스프링의 비동기 기술

스프링은 자바의 비동기 기술을 좀더 깔끔하게 구현하였다.

@Async

Spring MVC 3.2 부터 Servlet 3.0 기반의 비동기 요청 처리가 가능하다. @Async 애노테이션과 아래와 같은 return type 조합으로 가능하다.

  • future
    • 스프링에서 자동으로 만들어서 제공하는 ThreadPoolTaskExcutor에서 실행된다.
    • caller에게 return이 바로되나 blocking이 일어나는 get메서드로 결과 값을 가져와야 한다. get메서드 호출전에 다른 작업을 수행 할 수는 있다.
  • ListenableFuture
    • 스프링에서 Future 인터페이스를 확장해서 만든 객체
    • callBack을 추가할 수 있어 비동기적으로 결과값을 처리할 수 있다.

비동기 서블릿

사실상 Servlet3.0부터 비동기를 지원했다. 하지만 서블릿 요청 읽기,응답 쓰기는(I/O)는 블록킹 방식이였다. 3.1버젼이 되서야 non-blocking IO를 지원하면서 callback 처리가 가능해졌다.
참고로 쓰레드가 block되면 cpu와 메모리 자원을 많이 소모한다. 그 이유는 컨텍스트 스위칭이 2번 일어나기 떄문이다.(running -> waiting, waiting -> runnig)

  • 비동기 서블릿 작업 수행 방법

  • nio connector가 client 요청을 받으면 서블릿 쓰레드 풀에서 쓰레드를 가져와서 처리한다.

  • @Async와 같은 방식으로 비동기처리를 하면 작업쓰레드에 비동기 작업을 요청하고 바로 다시 쓰레드풀에 반환된다.

  • 작업쓰레드에서 비동기 작업이 끝나면 응답하기위해 쓰레드 풀에서 서블릿을 할당 받아 응답을(view) 만든후 nio connector에 전달 그리고 다시 풀에 반환된다.

서블릿 쓰레드의 갯수를 늘리는 대신 작업쓰레드를 사용하면 무슨 이익이 있는걸까?

오래걸리는 일부 작업만 작업쓰레드에 할당함으로써 서블릿 쓰레드를 오래걸리는 작업이 아닌 일반 웹처리에 최대한 활용할 수 있다.

Deferred Result

  • 스프링 비동기 기술의 꽃
  • 비동기 요청 처리를 위해 사용하는 Callable의 대안
  • http 요청이 오면 대기하고 있다가 외부 이벤트/클라이언트 요청이 발생하면 작업 수행후 결과를 한번에 써준다.

ResponseBodyEmitter

  • http sse 표준방식으로 데이터를 스트리밍 방식으로 응답하는 기술

예제 - https://github.com/JuJinPark/Reactive-Spring-Study/tree/main/src/main/java/com/example/reactivespringstudy/lesson4

0개의 댓글