1. Thread pool 구조
- 미리 스레드 풀을 만들어 두고 사용자의 요청이 오면 스레드 풀에서 스레드를 할당한다.
- 스레드는 자원이다.(스레드가 많으면 문맥 교환이 많이 발생하고 스케쥴링이 더 필요하고 메모리도 더 필요하다.)
- 이러한 스레드를 미리 일정수준 만들어 두는 것은 그만큼의 자원을 소모하고 있음을 의미한다.
- 스레드 풀에 존재하는 스레드의 수만큼 동시 처리가 가능하다.
- 각각의 스레드는 기본적으로 동기적으로 처리된다.
- IO가 발생하면 blocking 된다.
2. Reactive 구조
- 하나의 스레드가 multiplexing을 통해 다수의 사용자 요청을 처리한다.
- 스레드 풀이 없기 때문에 그만큼 자원 소모가 적다.
- 각각의 요청은 cpu 작업은 동기적으로 처리되고 io작업은 비동기 처리된다.
- cpu 작업이 많이 필요한 경우 blocking이 될 가능성이 있다.
- 반면, io작업이 많이 필요한 경우 높은 효율을 발휘한다.
- 오로지 하나의 스레드 만으로 multiplexing이 힘들 경우 process를 늘리는 등의 기법을 사용해 보안하는 기능이 존재한다.
- io 처리 중에서도 일부 처리는 blocking 처리된다.
- 이러한 blocking 처리를 위해 내부적으로 스레드 풀을 사용한다.
3. 생각
특수한 경우가 아니라면, cpu작업이 많이 필요하지 않은 요청이 대부분이다.
따라서 개인적으로는 Reactive 구조는 기존 Thread pool 구조의 한계를 극복하기 위해 나온 대안처럼 보인다.
물론, 기존에 오랜 기간 축적된 기술적 노하우는 Thread pool 구조에 더 많이 들어가 있는 것 같다.
4. 참고
https://godekdls.github.io/Reactive%20 Spring/springwebflux/#11-overview
https://yonghyunlee.gitlab.io/node/nodejs-structure/
https://sjh836.tistory.com/149
'java > 기타' 카테고리의 다른 글
[java] 내부 클래스(static vs non-static) (0) | 2022.06.18 |
---|---|
[Collection Framework] 정리 (0) | 2022.01.04 |
JDBC Connection pool 모니터링 지표에 대한 이해 (0) | 2021.12.01 |
java - Exception과 logging이 성능에 미치는 영향 (0) | 2021.10.08 |
java - InputStream& OutputStream close (0) | 2021.09.28 |
댓글