Server/Node.js

Node.js 비동기 처리

SambaLim 2019. 1. 25. 00:32
Node.js 비동기 처리

기존 웹 서버들이 쓰레드를 생성할 때, 일정한 메모리 공간을 사용하여서 클라이언트의 요청이 늘어날 경우, 서버를 늘려야하는 문제가 발생하였었습니다.

이와 다르게 Node.js비동기 이벤트 기반 아키텍쳐을 이용하기 때문에 이를 극복하고 뛰어난 성능을 발휘할 수 있었습니다. 그렇다면 비동기 이벤트 기반 아키텍쳐가 무엇인지 알아보려 합니다.

 

Blocking I/O

I/O 작업이 진행되는 동안 유저의 프로세스가 결과가 반환되기 전에는 다음 처리로 넘어가지 않는 것을 이야기합니다. 위의 그림에서와 같이 하나의 System call이 들어왔을 때, kernel에서 다른 data를 읽는중이라면 이 kernel이 data를 다 읽을 때까지 기다려야하는데, 이를 Block됐다고 표현합니다.

 

Multi Thread

다수의 요청이 들어온 경우, Blocking I/O는 속도의 제한을 갖고 이를 극복하기 위해 Multi Thread를 사용하게됩니다.

Wikipedia에서 설명하는 것은 사실 비전공자인 저에게는 무슨 말인지 와닿지 않는데 결국 멀티쓰레드는 쓰레드 여러개가 동시에 실행되어 요청을 처리한다는 개념입니다. 하나의 CPU를 여러 쓰레드가 나누어 동작하도록 함으로써 CPU를 공유하는 것 같은 효과를 냅니다.

Multi Thread 한계

하지만 Multi Thread에도 한계가 존재합니다. Multi Thread 기반의 서버는 일반적으로 클라이언트가 요청을할 때마다 Thread를 발생시킵니다. 즉 Client의 동시접속이 늘어날수록 Thread가 많이생겨 메모리 자원을 많이 소모합니다. 또한 스케쥴링을 위해 CPU연산이 늘어나게 되어 성능 저하가 발생할 수 있습니다.

 

비동기 처리

Node.js의 비동기 처리는 Single Thread로 이루어진 Event Loop에서 처리됩니다.

Event Loop

클라이언트가 서버에 요청하였을 경우, 서버내의 Event Loop는 계속 돌다가 요청에 대해 쓰레드를 실행시키기만 합니다. 쓰레드를 실행시킨 후, 다시 Loop로 돌아와 다음 요청을 기다립니다.

쓰레드가 종료되었을 경우, 미리 전달받은 콜백함수를 실행시켜 Event Loop에 전달하고 Event Loop는 결과를 클라이언트에게 전달해줍니다.

'Server > Node.js' 카테고리의 다른 글

Node.js 시작하기  (0) 2019.01.27
Node.js 인기이유  (0) 2019.01.23