Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

reactor pattern

Reactor 패턴은 하나 이상의 클라이언트로 부터의 요청(입력)을 동시처리하기 위해서 사용하는 패턴이다. 서버는 각 입력에 대해서 받을 이벤트를 동적으로 등록/해제하는 식으로 처리해야할 입력과 이벤트를 관리할 수 있다.
  1. 새로운 연결이 들어온다.
  2. 이 연결과 연결에 대해서 처리할 이벤트를 일괄 등록한다.
    • 이벤트는 "입력 데이터", "출력 데이터", "종료"등이 있을 수 있다.
  3. 주기적으로 이벤트를 확인한다.
  4. 이벤트가 발생하면 dispatcher 에 전달해서 처리한다.
2번이 multiplexing과정이다. 즉 여러 개의 입력을 처리할 수 있도록 다중화 한다. 3번 과정이 demultiplexing 과정으로 이벤트가 발생한 "하나의" 입력을 찾아낸다. 마지막으로 dispacher이 데이터를 처리한다.

기본적으로 demultiplexing 에서 multiplexing의 과정이 단일 스레드에서의 처리에 적합한 관게로 단일 프로세스 프로그램에서 두 개 이상의 입력을 처리하기 위해서 주로 사용한다.

Reactor pattern은 유닉스에서는 select, poll을 이용해서 매우 오래전 부터 입출력다중화라는 이름으로 사용해왔다. 아래는 select의 전형적인 입력 처리 구조다.
  • FD_SET을 이용, multiplexing 과정을 거쳐서 입력을 등록하고
  • select를 이용, demultiplexing 과정을 거쳐서 이벤트가 발생한 입력을 검사
  • 입력의 데이터를 처리
Reactor pattern의 흐름을 그림으로 나타냈다. 유닉스에서 입출력 다중화 기반으로 서버를 개발한 경험이 있다면, 이해가 쉬울 것이다.

Reactor Initiator : 서버를 비 봉쇄로 초기화 하고 dispatcher를 설정한다. 가장 먼저 서버는 클라이언트의 연결을 받을 서버 소켓을 등록한다. 이제 클라이언트가 연결을 하면, 이 소켓에 이벤트가 발생하고 accept 함수를 호출해서 클라이언트 소켓을 만든다.

Dispatcher : 클라이언트가 (connect 함수를 이용해서)연결하면, 클라이언트 소켓이 만들어 진다. 이 클라이언트 소켓을 이벤트에 등록한다. 클라이언트가 연결을 끊을 경우에는 제거하는 일도 함께 한다. 이제 dispatcher는 select() 함수를 이용해서, 등록된 소켓에서 이벤트가 발생하는 지를 확인한다.

Event Handler : 클라이언트 소켓에서 이벤트가 발생하면, 이벤트에 대한 이벤트 핸들러를 호출해서 이벤트를 처리한다.