[node.js] Reactor 패턴 (1)

초보개발자·2021년 1월 17일
0

node.js

목록 보기
1/3

1. I/O는 컴퓨터의 기본동작 중에서 가장 느림.

2. 블로킹 I/O

전통적인 블로킹 I/O는 I/O요청 작업이 완료 될때까지 스레드의 실행이 차단됨.
웹 서버에서 동시성을 처리하기 위해 새로운 스레드 또는 프로세스를 시작하거나 풀에서 가져온 스레드를 사용하는 방법.

단점
스레드의 idle tiem이 길어 많은 리소스 소모.

3. 논 블로킹 I/O

시스템 호출은 데이터가 읽히거나 쓰여질 때까지 기다리지 않고 항상 즉시 반환.
논 블로킹 I/O에 엑세스하는 가장 기본적인 패턴busy-waiting

busy-waiting이란 실제 데이터가 반환될 때까지 루프 내에서 리소스를 적극적으로 폴링하는 것.

폴링알고리즘의 단점
엄청난 양의 CPU 시간낭비.

3-1. 이벤트 디멀티플렉싱

일련의 리소스들로부터 들어오는 I/O 이벤트를 수집하여 큐에 넣고 처리 할 수 있는 새 이벤트가 있을 때까지 차단. (네트워크의 역다중화의 개념?)


하나의 스레드만 사용하더라도 다중 I/O 사용 작업을 동시에 실행할 수 있는 능력을 손상시키지 않음.
작업은 여러 스레드로 분산되지 않고 시간에 따라 분산.

장점
idle tiem이 짧음.
멀티스레딩의 동기화 문제가 없음.
간단한 동시성 전략.

4. Reactor 패턴

Reactor 패턴의 구조

1) Aplication은 Event Demultiplexer에 새로운 I/O 작업생성하여 request.
새로운 request는 논 블로킹 호출이며, 즉시 Aplication 제어 반환.

2) I/O 작업들이 완료되면 Event Demultiplexer는 새로운 이벤트를 Event Queue에 입력.

3) 이 시점에서 Event Loop가 Event Queue의 요소들을 반복 실행.

4) 각 이벤트의 핸들러 호출

5)
a. 핸들러 실행이 완료되면 Event Loop에 제어 반환.
b. 핸들러 실행 도중 비동기 event가 발생할시 Event Loop반환 이전에 새로운 request를 Event Demultiplexer에 전달

6) Event Queue의 요소들이 모두 처리되면, Event Loop는 block처리되고, 새로운 이벤트가 생길때 다시 과정 반복.

Reactor 패턴은 관찰 대상 리소스에서 새 이벤트가 생기기 전까지 차단하여 I/O를 처리한 다음, 각 이벤트를 관련 핸들러로 전달함으로써 반응함.

node는 Event Demultiplexer의 작업이 없고 Event Queue의 요소들이 모두 처리 되었을때 자동 종료.

이미지 출처 https://subscription.packtpub.com/book/web_development/9781785885587/1/ch01lvl1sec10/the-reactor-pattern

내용 출처
Node.js 디자인패턴

profile
주니어 개발자입니다!

0개의 댓글