IT/Others

Reactor 패턴과 Proactor 패턴

김 정 환 2023. 5. 6. 19:17
반응형

 

리액터 패턴과 프로액터 패턴에 대해서 알아보겠습니다. 둘은 '이벤트 핸들링 패턴' 입니다. 이 패턴은 멀티 스레드 이후에 도입되었습니다. 대용량 네트워크 환경에서 멀티 스레드는 어느 정도 효과를 보았는지 몇 가지 문제가 있었습니다. 스레드가 많이 필요하니 오버헤드가 생기거나 자원의 공유 문제가 발생했습니다. 그래서 이벤트가 발생하면 처리하고 이후에 콜백으로 받는 패턴을 도입합니다. 이벤트 핸들링 패턴의 요소는 아래와 같습니다.

  • Event sources :  이벤트를 감지하고 가져옴
  • Demultiplexer : 이벤트가 발생할 때까지 기다리다가 발생하면 이벤트 핸들러에게 이벤트를 전달
  • Event handlers : 이벤트를 처리하고 콜백으로 응답을 보냄
 
 
이벤트 처리 패턴의 특징은 비동기 처리가 가능하고 순서를 보장하지 않습니다. 자 그러면 대표적인 패턴인 리액터와 프로액터 패턴에 대해서 알아보겠습니다.
 

 

 

Reactor 패턴

리액터 패턴의 요소는 아래와 같습니다.

  • Handle : 내부나 외부에서 오는 이벤트를 생성하거나 큐에 넣을 수 있는 이벤트 소스를 식별
  • Event Handler : 이벤트를 처리하는 일련의 메서드 인터페이스를 정의
  • Concrete Event Handler : 이벤트 처리하는 메서드 구현
  • Reactor : 이벤트 핸들러와 핸들을 제거하고 등록하는 인터페이스를 제공. 이벤트 루프를 실행하여 이벤트를 받고(dispatching), 이벤트를 이벤트 핸들러로 디멀티플렉싱(demultiplexing)
  • Synchronous Event Demultiplexer: 핸들에서 발생하는 대기 이벤트를 차단

 

위 그림에서 리액터는 이벤트를 기다렸다가 이벤트를 이벤트 핸들러에게 디멀리플렉싱하고 디스패칭 합니다. 그리고 이벤트 핸들러는 들어온 이벤트를 처리합니다. 이 과정을 절차 다이어그램으로 나타내면 아래와 같습니다. 먼저 1~3 핸들러를 등록해서 리액터가 핸들러로 이벤트를 보낼 수 있는 준비를 해놓습니다. 리액터는 이벤트가 발생할 때까지 대기합니다.  이후 4~8 이벤트가 발생하여 들어오면 받아(dispatching)서 이벤트에 맞는 핸들러로 보내(demultiplexing)주고 이벤트 핸들러는 할당 받은 이벤트를 처리합니다.

 

 

리액터 패턴을 사용하므로서 좋은 점은 단일 스레드에서 많은 소켓의 멀티 I/O 작업을 동시에 처리할 수 있습니다. 그래서 네트워크 트래픽이 많은 프로그램에서 많이 사용됩니다. 

 

 


Proactor 패턴

 

 

프로액터 패턴의 요소는 아래와 같습니다.

  • Handle : 내부와 외부에서 오는 이벤트를 생성하는 이벤트 소스를 식별
  • Completion Handler : 이벤트를 처리하는 일련의 메서드 인터페이스를 정의
  • Concrete Event Handler : 이벤트 처리하는 메서드 구현
  • Proactor : 이벤트 루프를 제공하고, 이벤트를 받아서(dispatching) 이벤트를 핸들러에게 전달(demultiplexing)
  • Asynchronous Event Demultiplexer : completion event queue에 추가될 대기 이벤트를 차단하고 caller에게 반환
  • Completion Event Queue : 이벤트 핸들러에게 분배되기 전에 기다리는 위해서 이벤트를 버퍼하는 기능
  • Asynchronous operations : 애플리케이션을 대신해서 장기적으로 서비스 되어지는 작업
  • Asynchronous Operation Processor : 핸들에서 발생하는 비동기 작업을 실행, 이벤트를 생성하고 큐에 저장.
  • Initiator : 비동기 작업을 시작하고, 작업이 끝났음을 알려주는 비동기 프로세스와 proactor를 등록, 이벤트 핸들러를 등록
 
 

 

위 그림에서 애플리케이션은 작업을 비동기적으로 발생시키고 이후에 완료가 되면 콜백으로 전달 받을 수 있습니다.  이 과정을 절차 다이어그램으로 나타내면 아래와 같습니다. 1~2 프로액터를 등록, 핸들러 등록, 이벤트 생성 등을 수행합니다. 비동기로 처리할 이벤트를 생성하여 저장합니다. 3~11 프로액터는 비동기 작업을 지시합니다. 처리 가능한 작업이 생기면 Async OP가 비동기 처리를 시작합니다. 프로액터는 큐에서 작업을 가져와(dispatching) 핸들러에게 전달(demultiplexing)합니다. 12~13 이벤트를 처리하기 위해 핸들러에게 이벤트를 전달하고 핸들러는 이벤트를 처리합니다.

 

 

프로액터 패턴도 리액터와 마찬가지로 네트워크 트래픽이 많은 환경에서 사용됩니다.

 

 


비교

이쯤에서 둘의 차이가 애매하게 느껴집니다. 다른 것 같으면서도 같은 것 같은 느낌입니다. 리액터 패턴의 dispatching와 demulitiplexing은 순차적으로 동기적으로 수행되는 반면에, 프로액터 패턴은 비동기로 수행이 됩니다. 그렇다고 리액터 패턴이 완전히 비동기라는 말은 아닙니다. 전체적으로 보면 이벤트는 루프를 돌면서 비동기로 처리되기 때문입니다. 

또 하나 다른 점은 이벤트 자체 입니다. 리액터 패턴은 I/O 작업에서 들어온 이벤트를 가지고 작업을 수행하지만, 프로액터 패턴은 I/O 작업 자체를 수행하고 이벤트를 생성합니다.

 

 

 

 

참고

http://didawiki.cli.di.unipi.it/lib/exe/fetch.php/magistraleinformatica/tdp/tpd_reactor_proactor.pdf

반응형