내년에 진행될 프로젝트의 일부 내용이 육상,해상,항공 데이터를 실시간으로 받아서 수집하고
해당 데이터를 표출하는 내용이 있다고 한다.
데이터를 수집할 때 만약 기존의 Spring의 방식인 블로킹 방식으로 진행할 경우 접속자 수 증가에 따라
서버가 죽거나 속도가 어마어마 하게 느려질 수 있는 우려가 있다.
(동기방식으로 이루어져있기 때문에 앞서 들어온 작업을 다 처리하기 전 까진 계속 작업이 쌓이게 된다)
이를 해결하기 위해 비동기 방식으로 진행할 수 있는 Reactive Spring에 대해서 공부를 사전에 하려고 한다.
개념부터 이것저것 만들어보면서 한번 익혀 보려고 한다.
Java는 인터프리터 방식으로 직렬적으로 Task를 처리한다. 그렇기 때문에 요청을 보낸 뒤 응답이 오기 전 까지는 Application이 Block이 되어 다른 작업을 수행할 수 없다. 이는 해당 자원이 효율적으로 사용되지 못하고 있음을 의미한다. Multi Thread로 병렬적 처리를 하더라도 Thread 수의 한계가 있기 때문에 대용량 요청이 들어 문제가 될 수 있기에 비동기와 Non-Blocking I/O의 새로운 프로그래밍 모델이 제안되었다.
데이터의 흐름과 변화의 전파에 중점을 둔 프로그래밍 패러다임
작성한 코드의 순서대로 진행되는 기존의 명령형 프로그래밍과 달리 데이터의 흐름을 먼저 정의하면 데이터의 변화 혹은 작업의 종료에 따라 반응하여 진행되는 프로그래밍
1970년대에 리액티브 프로그래밍 에 대한 학술 자료가 나왔고 사용할 수 있는 비동기, 이벤트 주도 프로그래밍 기술이 나온지도 오래되었다. 하지만 아직까지 리액티브 프로그래밍을 써야만 할 정도의 대규모 서비스가 많지 않았기에 주류로 올라오지 못하고 있었지만, 시대는 변하고 전세계 고객을 24시간 끊임없이 상대해야한다. 또한 클라우드 환경에서 애플리케이션 운영이 보편화 되면서 자원을 더 효율적이고 일관성있게 사용하는 방법을 찾고 있으며, 그 해법이 리액티브 스트림(reacitve stream)이다.
리액티브 스트림은 발행자(publisher)
와 구독자(subscriber)
사이의 간단한 계약을 정의하는 명세이다.
트래픽을 가능한 빨리 발행하는 대신에 구독자가 ‘난 10개만 더 받을 수 있어’ 라고 발행자에게 알리는 방식으로 트래픽을 제어할 수 있다. 즉 배압(backpressure)
을 적용할 수 있다.
Spring Reactor
에서는 Flux와 Mono라는 두 가지 리액티브 타입을 제공한다. 이 둘은 비동기적 작업을 처리하고 리액티브한 방식으로 데이터 스트림
을 다루는데 사용된다.
리액티브 프로그래밍을 사용하려면 모든 과정이 리액티브여야 한다. 모든 계층이 리액티브로 동작하게 만들고 블로킹 방식으로 연결되는 DB를 호출하면 리액티브는 무너진다. 블로킹 방식으로 호출한 스레드는 응답을 받을 때까지 다른 작업을 하지 못하고 기다리기 때문이다.
그래서 리액티브가 제대로 동작하려면 DB도 리액티브하게 동작해야한다.
기존 관계형 DB(RDBMS)를 리액티브 프로그래밍 모델과 연동을 위한 R2DBC
가 있다. 이는 리액티브 스트림을 활용한 관계형 DB에 연결할 수 있도록 설계되었고 비동기적인 DB 접근을 지원한다.
Reactive하게 Spring 개발을 하기 위해서는 모든 환경이 Reactive 해야만 한다.
어느 한 부분이라도 Reactive 하지 않으면 거기서 병목현상이 발생하게 된다.
내가 주로사용하는 DB는 POSTGRESSQL
이니까 POSTGRESSQL
을 Reactive하게 사용할 수 있게 도와주는
r2dbc driver를 설치하여 간단한 페이지를 만들어봐야겠다.
/
* 참고하면 좋을 글
[ Reactive spring 이해를 도와주는 배민 기술 블로그 (링크) ]
잘 읽었습니다. 좋은 정보 감사드립니다.