티스토리 뷰

관련 있는 이전 발행글

2021.03.23 - [언어와 프레임워크/javascript] - 반복문 비동기 처리 ( + Event Loop, Promise )

2021.11.29 - [이론/동시성모델] - 서버는 여러개의 request를 어떻게 감당할까?

2022.02.02 - [이론/동시성모델] - [문서정리] I/O Bound 서버를 스케일링 하기 위한 리액터 패턴

 

참고자료

server architecture (thread-base, event-base, SEDA)

Performance and scalability analysis of Java IO and NIO based server models, their implementation and comparison

thread-base model vs async sever with event loop

 

 

 

 

1) thread-based server

들어오는 커넥션(http 서버라면 http request 1개, 웹소켓 채팅 서버라면 클라이언트 1명과의 TCP 커넥션. 등등)당 별개의 스레드(or 프로세스) 1개를 할당 해주는 방식.  보통 synchronous blocking I/O 방식으로 IO 처리. 코드 실행순서가 순차적임.

- multi-process방식 => prefork 방식을 도입하긴 하지만 여전히 heavyweight.

- multi-thread방식 => global variable, cache share. 동기화 문제 신경써야 함.

thread-based server / multi-process server / multi-thread server

 

 

2) Event-drvien server

싱글 스레드로 multiple 커넥션 처리. asynchronous/non-blocking 처리 방식.

이벤트는 이벤트 큐에 enqueue되고, 싱글스레드 이벤트 루프가 큐에서 이벤트 dequeue해서 등록된 이벤트 핸들러에 처리 위임.

메인 스레드는 1개이지만, 이벤트 핸들러에서 처리할 작업이 blocking or cpu-consuming 하면 (이벤트 루프가 위치한 메인 스레드 외의) 다른 워크 스레드에서 수행될 수 도 있음.

control flow가 순차적이지 않음. cascade of asynchronous calls and callbacks that get executed on events

 

논블로킹 IO multiplexing 패턴

- reactor 패턴 => 코어 요소 synchronous event demultiplexer ( select, poll, epoll )

- proactor 패턴 => Posix AIO 같은 truly asynchronous, non-blocking I/O 인터페이스를 기반으로 제공됨. 

event-driven server
1reactor pattern vs proactor pattern

 

 

 

3) SEDA (staged event-driven architecture)

하이브리드 모델.

서버 로직을 여러개의 잘 정의된 stage로 쪼갠다음에 큐를 이용해서 서로 연결. 1개의 http request 처리 과정 동안 여러개의 스테이지를 옮겨다닌다. (이거 마이크로서비스 아닌가...?)

멀티 스레드 적인 측면 => 각 stage가 서로 다른 스레드 위에서 동작해서 각자 다른 코어 utilize.

이벤트 드리븐 적인 측면 => 스테이지 연결하는 파이프라인에 엔큐, 디큐해서 처리하는 방식

Apache MINA가 이 방식으로 구현되어있다.

 

댓글
공지사항
최근에 올라온 글