spring/reactive
-
Spring 비동기 처리 - 3(WebClient와 Reactor)spring/reactive 2021. 6. 7. 10:43
배경 비동기 처리를 이용해 성능을 개선했다. 이제 Reactive Streams를 구현한 스프링의 Reactor API와 비동기 통신을 위한 WebClient를 활용해보자. AsyncRestTemplate -> Webclient DeferredResult, Future -> Reactor API(Mono, Flux) https://www.youtube.com/watch?v=bc4wTgA_2Xk&list=PLv-xDnFD-nnmof-yoZQN8Fs2kVljIuFyC&index=1 마찬가지로 토비님의 실습을 열심히 따라하며 공부한 내용이다. 의존성 분석 spring boot webflux 의존성을 추가하면 위와 같이 의존성이 추가된다. spring-webflux에 앞으로 사용할 Webclient, React..
-
Spring 비동기 처리 - 2(성능테스트)spring/reactive 2021. 6. 5. 11:32
배경 비동기 처리를 이용해 한 스레드가 불필요하게 오래 블락된 경우를 개선해보았다. 이제 동기방식으로 스레드를 관리할 때 어떤 문제가 발생할 수 있는지 또 그걸 비동기적으로 어떻게 풀어나갈지 실제로 테스트해보자. https://www.youtube.com/watch?v=ExUfZkh7Puk&list=PLv-xDnFD-nnmof-yoZQN8Fs2kVljIuFyC&index=6 토비님의 실습을 참고하며 공부한 내용이다. 문제 상황 클라이언트가 서버1에게 요청을 날리면 서버1은 서버2에게 요청을 날리고 응답이 올 때까지 블락된다. 서버2의 응답이 서버1에 도착하고 서버1이 최종적으로 클라이언트에게 응답을 주는 방식이다. 이때 100개의 요청이 동시에 서버1로 몰리는 경우를 테스트해보자. 요청하는 클라이언트 코..
-
Spring 비동기 처리 - 1(스레드 작업 분리)spring/reactive 2021. 6. 3. 18:08
배경 웹서버로 요청이 들어오고 응답이 나가기까지 과정을 간단하게 도식화했다. 요청이 들어온 경우 스레드풀에서 스레드를 할당 받고 비즈니스로직을 수행한 후 적절한 데이터와 함께 응답을 보낸다. 탐켓의 기본 설정만 따르는 경우 스레드풀로부터 할당받은 스레드는 요청이 들어온 뒤부터 응답이 나갈 때까지 반납되지 않는다. 비즈니스로직이 단순히 WAS내에서만 동작하는 로직이라면 큰 문제가 없겠지만 외부 DB와 통신하거나 다른 노드와 작업하는 로직을 포함하게 된다면 스레드는 비교적 많은 시간을 반납되지 못한 상태로 남게 된다. 서버로의 요청이 갑자기 몰려 스레드풀의 모든 스레드를 할당한 상태에서 대부분의 작업스레드가 외부IO를 수행하느라 반납이 지연되는 상황이라면 서버의 응답성은 현저하게 낮아질 것이다. 이번 작업에..
-
Reactive Streams 구현spring/reactive 2021. 6. 1. 19:10
배경 Observer패턴은 subject-observer 기반 이벤트 프로그래밍을 비동기로 처리하기 쉬운 환경을 제공한다. 공부하려는 Reactive Streams 또한 Observer패턴 기반으로 만들어졌으며 여기에 완료라는 개념과 에러를 핸들링하는 방식을 추가해서 완성되었다. Reactive Streams 공식문서 내용을 보면 Publisher는 subject와, Subscriber는 observer와 대응되는 걸 알 수 있다. 또한 Subscriber의 표준을 확인해보면 onSubscribe는 반드시, onNext()는 자유롭게, OnError나 onComplete는 구현여부를 프로그래머에게 맡겼다. 즉, 기본 Observer패턴에 약간의 기능을 선택적으로 추가하게 만든 것이다. 아키텍처 Subsc..
-
Observer 패턴spring/reactive 2021. 6. 1. 16:34
배경 reactive카테고리에 갑자기 Observer패턴이 있으니 당황할수도 있지만 reactive프로그래밍의 핵심인 Reactive Streams는 Observer패턴의 발전된 형태이니 Observer패턴을 복습할 필요가 있다고 생각했다. 핵심적인 부분만 간단하게 짚고 넘어가자. Subject Observer Status - subject : 크리에이터 - observer : 구독자 - status : 영상 Subject 이벤트가 발생한 시점에 구독자에게 영상을 전달하는 크리에이터라고 생각하면 쉽다. add()는 구독자를 추가하고, remove()는 구독취소를 처리하고, notifyStatus()는 영상이 업로드됨을 알리는 기능을 수행한다. 내부적으로 구독자를 관리하는 방법은 DB가 될 수도, 인메모리..