노드의 탄생 배경


발생일: 2012.01.15

문제:
팀에서 노드(Node.js) 스터디를 하고 있다.

노드가 처음은 아니고, 얼마 전 노드로 작은 모듈을 만들어보기도 했지만,
책을 읽으니 확실히 좋다. :)

지금은 '노드제이에스 프로그래밍'이란 책으로 스터디를 진행하고 있는데,
글도 매끄럽고 쉽게 잘 읽혀져 좋다.


책의 1장에 노드의 탄생 배경에 대한 내용이 있는데,
꼭 알아두면 좋을 것 같아 메모해둔다.

(노드 예찬론자였던 양형이 생각난다. ㅎㅎ)


해결책:

var result = db.query('SELECT * FROM table');
// result를 사용

일반적인 프로그래밍 언어나 플랫폼에서는 Blocking I/O 방식을 사용한다.
즉, I/O를 요청하고 그 결과를 받을 때까지 스레드는 아무 일도 안 하는 상태로 대기한다.
스레드는 메모리 등 시스템 자원을 많이 차지하기 때문에 무한대로 생성할 수 없으며,
멀티스레드의 경우 여러 스레드가 동시에 같은 자원을 요청했을 때 서로 먼저 차지하려고 하는 레이스 상태(race condition)나,
서로 차지하고 있는 자원을 무한정 기다리는 교착 상태(deadlock)에 빠질 수 있으므로 이런 부분을 신경 써서 프로그래밍 해야 한다.
또한 외부 시스템에 요청을 보내는 경우, 네트워크 연결 상태나 상황에 따라 응답 시간이 달라지며,
I/O를 동기로 사용하면 스레드는 I/O 수행 시간동안 대기해야 한다.


db.query('SELECT * FROM table', function (result) {

  // result를 사용

});


라이언(노드의 창시자)은 지연시간이 긴 I/O를 동기 방식으로 사용하기보다는,
싱글 스레드 기반의 이벤트 루프(Event Loop)이 더 낫다고 생각했다.
I/O 등의 작업을 요청하고 대기 상태로 기다리는 대신 다른 일을 처리하다가 요청한 작업이 완료됐다는 이벤트가 발생하면,
이벤트 루프가 감지하고 이벤트에 관련된 코드를 처리하는 방식이다.
이벤트 루프를 이용해 I/O를 비동기로 사용하면 싱글 스레드만으로도 더 좋은 성능을 가질 수 있다는 생각이다.

자세한 내용은 아래 영상을 참고.



FAQ) 
1. 멀티스레드보다 이벤트 루프의 성능이 좋다면, 왜 모든 플랫폼이 이벤트 루프를 사용하지 않는가?

  문화적인 이유
    개발자들은 I/O를 동기 방식으로 사용하는 블록킹 I/O로 배웠다.

  인프라적인 이유
    이벤트 루프를 이용해 제대로 된 성능을 발휘하려면 I/O도 넌블록킹 I/O가 돼야 한다.
    블로킹 I/O를 사용하면 스레드가 함께 블록킹되기 때문에 비동기로 만들더라도 성능 상 한계가 있기 때문이다.
    따라서 넌블록킹 I/O를 사용한다면 이벤트 루프의 성능을 최대한으로 이끌어 낼 수 있는데,
    과거에는 넌블록킹 I/O를 사용하기 위한 인프라가 제대로 갖춰지지 않았다.


2. 노드의 단점은?
  스케일업으로 성능이 크게 향상되지 않는다.
  멀티스레드 기반에서는 스케일업을 하면 더 많은 스레드를 만들 수 있으므로 성능이 좋아진다.
  CPU의 속도가 빨라진다면 노드도 빨라지겠지만, 싱글 스레드를 사용하는 노드는 CPU 개수가 메모리 용량에는 큰 영향을 받지 않는다.
  이 문제는 노드 인스턴스를 여러 개 실행해 인스턴스 간의 메시지 통신을 통해 해결할 수 있다.



추가)
J과장님이 알려준 링크.

  node.js의 eventloop와 비동기 I/O에 대한 discussion




카테고리

분류 전체보기 (704)
About me. (6)
Daylogs (669)
비공개 (0)
영어공부 (0)
My works - 추억 (29)