- Reactor pattern2023년 11월 19일
- starryeye
- 작성자
- 2023.11.19.:36
이번 포스팅에서는 Reactor pattern 에 대해 알아보겠다.
reactor pattern 의 목표
한정된 스레드로 동시에 들어오는 요청을 효율적으로 처리 가능
Reactor 패턴
대표 사용 기술
Java NIO, Selector, epoll
특징
Selector 기반의 Java NIO 를 사용하기 때문에
동기 non-blocking 으로 동작한다. (IO 관점)
작동 방식
accept, read, write 등의 이벤트(준비 완료)들을 한 곳(Selector)에 등록하여 모니터링
-> Selector 사용, Multiplexing
준비 완료 이벤트(처리될 준비가 됨)일 경우에는 request handler 에게 전달한다.
-> Demultiplexing
대표 컴포넌트
Reactor
별도의 스레드에서 실행한다.(한 개)
-> 이를 Event Loop 라 부르기도 한다. (특히, Netty 에서..)
여러 요청의 이벤트를 등록하고 감시하며, 준비 완료 이벤트(처리될 준비가 됨)이면 dispatch 한다.
Handler (Event Handler)
Reactor 로 부터 이벤트를 받아서 처리한다.
(함수형 인터페이스)
Handler 의 실행이 Reactor 에 영향을 끼치지 않아야한다. (스레드 분리)
참고
Handler 실행과 Reactor 실행 스레드를 분리하지 않는다면..
Reactor 의 단일 스레드가 Handler 의 실행도 책임 지게 되는데..
Handler 의 처리시간이 길면 해당 서버 전체에 영향을 주게 된다.
쉬운 이해를 위한 그림
위 그림에서 Dispatcher 는 Reactor 라고 생각해도 된다.
적용 사례
Reactor 패턴은 Netty, Node.js 등에서 사용된다.
한계점
1. Reactor 에서 단일 스레드로 동작한다.
따라서, 감당하기 힘든 트래픽이 생기면 SPOF 가 될 수 있다.
2. reactor pattern 은 Java NIO, Selector, epoll 기술에 근본을 두고 있기 때문에
IO 관점에서 동기 non-blocking 이다.
Event Handler 에서 blocking 로직이 있거나 처리 시간이 긴 로직이 존재하는 상태에서
동시 요청이 많다면 한정된 스레드 이상의 자원이 필요하게 되어
시스템 전체에 영향이 생긴다.
따라서, Event Handler 의 로직엔 blocking 로직과 처리 시간이 긴 로직을 피해야한다.
읽어보면 좋을 듯..
"Scalable IO in Java" of Doug Lea
https://gee.cs.oswego.edu/dl/cpjslides/nio.pdf
'Spring Reactive Stack > Netty' 카테고리의 다른 글
Netty 2 (0) 2024.01.21 Netty 1 (0) 2024.01.17 Proactor pattern (0) 2023.11.20 다음글이전글이전 글이 없습니다.댓글