리액터 패턴과 프로액터 패턴에 대해서 알아보겠습니다. 둘은 '이벤트 핸들링 패턴' 입니다. 이 패턴은 멀티 스레드 이후에 도입되었습니다. 대용량 네트워크 환경에서 멀티 스레드는 어느 정도 효과를 보았는지 몇 가지 문제가 있었습니다. 스레드가 많이 필요하니 오버헤드가 생기거나 자원의 공유 문제가 발생했습니다. 그래서 이벤트가 발생하면 처리하고 이후에 콜백으로 받는 패턴을 도입합니다. 이벤트 핸들링 패턴의 요소는 아래와 같습니다.
- 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
'IT > Others' 카테고리의 다른 글
리액티브 데이터 타입(Mono, Flux)을 사용하는 이유 (0) | 2023.05.07 |
---|---|
I/O operation (0) | 2023.05.06 |
디자인 패턴 소개 (POSA 2) (0) | 2023.03.19 |
디자인 패턴 소개 (POSA 1) (0) | 2023.01.26 |
객체 지향 상속의 종류 : Subclassing 과 Subtyping (0) | 2022.11.26 |