티스토리 뷰
관련 있는 이전 발행글
2021.03.23 - [언어와 프레임워크/javascript] - 반복문 비동기 처리 ( + Event Loop, Promise )
2021.11.29 - [이론/동시성모델] - 서버는 여러개의 request를 어떻게 감당할까?
2022.02.02 - [이론/동시성모델] - [문서정리] I/O Bound 서버를 스케일링 하기 위한 리액터 패턴
참고자료
server architecture (thread-base, event-base, SEDA)
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. 동기화 문제 신경써야 함.
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 인터페이스를 기반으로 제공됨.
3) SEDA (staged event-driven architecture)
하이브리드 모델.
서버 로직을 여러개의 잘 정의된 stage로 쪼갠다음에 큐를 이용해서 서로 연결. 1개의 http request 처리 과정 동안 여러개의 스테이지를 옮겨다닌다. (이거 마이크로서비스 아닌가...?)
멀티 스레드 적인 측면 => 각 stage가 서로 다른 스레드 위에서 동작해서 각자 다른 코어 utilize.
이벤트 드리븐 적인 측면 => 스테이지 연결하는 파이프라인에 엔큐, 디큐해서 처리하는 방식
Apache MINA가 이 방식으로 구현되어있다.
'시리즈 > Concurrency' 카테고리의 다른 글
모던 concurrency 맛보기 (0) | 2022.12.02 |
---|---|
파이썬 비동기 프로그래밍 (0) | 2022.03.09 |
[문서정리] I/O Bound 서버를 스케일링 하기 위한 리액터 패턴 (0) | 2022.02.02 |
[문서정리] 루비로 동시성 모델 소개하기 Part II (0) | 2022.01.31 |
[문서정리] 루비로 동시성 모델 소개하기 Part I (0) | 2022.01.30 |