Reactor pattern

이번 포스팅에서는 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