Reactor 패턴
- 어떠한 이벤트가 발생하면, 이곳으로 알려달라는 방식.
- 윈도우 메시지 핸들러처럼, 특정 이벤트가 발생한다면 통지 받겠다는 방식.
Proactor 패턴
- 특정 작업을 시키고, 그 작업이 완료되면 알려달라는 방식.
- IOCP에서 Completion Port가 이 방식을 취하고 있다.
말로만 보면 비슷한데, 깊이 고민해보면 차이점이 명확해진다.
Proactor는 작업을 시키면서 콜백함수를 직접 넘김으로써 구현되고, Reactor는 디스패쳐를 구현하는 구조가 일반적.
Reactor 패턴 사용시에는 디스패쳐를 통함으로써 스팟 포인트가 발생하게 되는 단점이 있다고 보면된다.
이에 비해 Proactor는 명령을 내린 작업에 대해서만 통지를 받게 된다.
IOCP의 예를 들면, 내가 물려놓은 소켓에 Recv 이벤트가 발생했다고 해도, WSARecv를 걸지 않으면, 해당 이벤트가 발생했는지 여부에 대해 통지를 받지 않음을 의미한다.
이는 이벤트 폭발로 인한 부하 발생이나, 스팟 포인트를 감소 시킬 수 있는 테크니컬한 멀티 스레드 프로그래밍이 가능하게 하려면 Reactor 패턴보다는 Proactor 패턴이 유리하다는 것을 의미힌다.
Reactor 패턴은 디스패쳐를 거치기 때문에, 직렬화에 유리하긴 하나 이 디스패쳐가 스팟 포인트가 되는 것이 일반적이란 단점이 있다. (물론 그렇지 않게 구현 할 수 도 있으나, 그렇게 멀티스레드 로직을 수행하기엔 예외 상황이 지나치게 커질 위험이 있다.)
stateless 하게 구현하기 위해선 proactor 기반의 처리 구조로 구현하는 것이 좀 더 유리하다고 볼 수 있다. (stateless하게 만들 수 있다면, reactor패턴을 쓴다고 해도 스팟 포인트를 줄일 수 있긴 하다.)