Proactor pattern

Reactor pattern 에 이어서 Proactor pattern 을 알아보겠다.

두 패턴을 가르켜 Event handling pattern 이라 부르기도 한다.

 

Proactor 패턴

Reactor 패턴에서는 단일 스레드로 IO 이벤트를 처리하였다.

단일 스레드가 커널에 epoll 을 활용하여 IO 작업의 준비 완료 상태를 주기적으로 확인하였는데..

(즉, Reactor, Selector 가 병목 지점인 것)

Proactor 패턴에서는 AIO 로 동작하므로

커널이 AIO 로 IO 작업의 준비 완료 상태를 알려 주기 때문에

busy-wait 현상을 없앨 수 있다.

 

 

사용 기술

Proactor 패턴은 Java AIO를 사용한다.

 

특징

Java AIO 를 사용하기 때문에 비동기 non-blocking 으로 동작한다. (IO 관점)

 

작동 방식

I/O 작업이 시작될 때, 연산을 완료한 경우에 실행될 콜백을 등록한다.

I/O 작업이 비동기적으로 수행되며, 작업 완료 시 해당 콜백을 자동으로 호출한다.

 

대표 컴포넌트

Proactor

각 이벤트가 준비 완료 상태일 때 호출 될 Handler 를 콜백으로 등록한다.

즉, Handler (Completion Handler) 는 비즈니스 로직이 된다.

 

Java AIO 를 사용하면, AIO 자체적으로 스레드 풀을 관리한다.

즉, 커널이 IO 작업 완료 이벤트를 AIO 로 알리면,

AIO 는 가지고 있는 스레드 풀로 Completion Handler 를 호출한다.

(구현 코드 상, 템플릿 콜백 패턴을 사용하게 됨)

 

 

쉬운 이해를 위한 그림

Reactor 패턴과 비슷하지만.. Application 에 busy-wait(loop) 가 없음을 생각해볼 수 있다.

 

 

적용 사례

Windows의 IOCP (Input/Output Completion Port) 를 사용한 시스템

 

 

Reactor pattern 과 Proactor pattern

Reactor 패턴은 주로 이벤트가 발생할 때까지 대기하고,

발생한 이벤트에 대해 처리하는 NIO/Selector/epoll 기반의 모델을 위함이고

Proactor 패턴은 I/O 작업 완료 시 자동으로 알림을 받는,

완전한 비동기적인 AIO 기반의 모델을 위해 설계되었다.

 

Reactor 패턴은 한정된 스레드에 좀더 적합하고..

Proactor 패턴은 멀티 스레딩에 적합하다고 생각할 수 있다.

 

두 패턴은 각각의 사용 사례와 성능 요구에 따라 선택될 수 있다.

 

Proactor pattern 이 Reactor pattern 을 완전히 대체할 수 없는 이유

1. OS 가 비동기 IO 를 지원하지 않는 경우가 있다.

그러면 Java AIO 를 사용할 수 없다.

또한 사용했다가 다른 OS 로 이식을 해야한다면.. 큰일남..

 

2. 복잡성

Proactor 에서는 callback, Future 를 사용해야하므로 코드의 복잡성이 올라간다.

반면, Reactor 에서의 Event Loop 로 처리하므로 callback, Future 가 없음

 

3. 개발자의 세밀한 제어

Reactor 패턴에서는 Event loop 를 개발자가 직접 구현을하고 이벤트 처리 순서와 로직을 조정가능하다.

반면, Proactor 패턴에서는 OS 와 AIO(라이브러리) 수준에서 비동기 작업이 완료되고 콜백이 호출되는 방식으로..

개발자의 세밀한 조정이 어려울 수 있음..

'Spring Reactive Stack > Netty' 카테고리의 다른 글

Netty 2  (0) 2024.01.21
Netty 1  (0) 2024.01.17
Reactor pattern  (0) 2023.11.19