- Proactor pattern2023년 11월 20일
- starryeye
- 작성자
- 2023.11.20.:27
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 다음글이전글이전 글이 없습니다.댓글