node.js lifecycle 100만명이 동시에 접속한다면 트래픽 처리는 ?

node.js lifecycle 100만명이 동시에 접속한다면 트래픽 처리는 ?

728x90

반응형

안녕하세요 개발자 090.js 입니다~~

오늘은 node 언어의 라이프 사이클( 코드가 실행되는 순서?) 를 간단히 알아보며

100만명이 서버에 요청과 응답을 원할때 그 트래픽은 어떻게 처리하는지를 설명하는 시간을가져볼게요.

사실 여러분이 node.js를 사용한다면 이미 대략적인 노드의 라이프사이클을 알것이라고 생각해요.

비동기, 동기가 무엇인지 알고있나요?

동기식 코드를 사용한다면 동기식 작업이 끝난다음 그다음 작업을 수행하는걸 말하는데

동기함수 1

동기함수 2

위의 함수2개를 동기함수 2, 동기함수1 순서대로 실행하면

동기함수2가 완전히 끝날때까지 기다린후 동기함수1 이 실행되는 방식을말해요

동기함수2 -----> 끝 동기함수 1 실행-----> 끝

반대로 비동기식 코드는 해당 코드들을 스레드의 수 혹은 프로세스의 수에 맞게 작업들을 동시에 처리할수있음을 말하는데

비동기함수 1

비동기함수 2

비동기함수 3

이렇게 3가지비동기함수를 실행시키고 3개의 스레드를 이용하여 작업을 처리한다면

비동기함수1 -----> 끝

비동기함수2 ----->끝

비동기함수3 ----->끝

엥 그렇다면 무조건 비동기함수를 이용하는게 작업을 더빨리 처리할수있으니까 좋은거네요??

No!

예를들어 쇼핑몰에서 무언가 결제를 할때

돈이 입금이된 순간 결제가 완료되겠죠?

그런데 돈이 입금이되기도 전에 결제가 되고 빠르게 결제를 취소한다면 에러가 발생한거네요!?

그렇기에 프로그램을 작성할때 꼭 순서대로 처리되야하는 부분에서는 꼭 동기함수의 필요성을 느끼게되요.

특히 코딩을 하다보면 동기함수를 사용하는경우가 정말 많죠.

이렇게 동기와 비동기 의 차이점을 알아봤다면 node.js 의 라이프 사이클이 응답과 요청을 어떻게 처리하는지 봅시다.

router.get('/main'){

res.send(블라블라);

}

위 같은 코드에서 서버로부터 요청이 온다면 node.js는 이벤트루프라는곳에 요청을 보내버립니다.

요청1 , 요청2, 요청 3 .....................요청 100 이 있다면

이벤트루프 라는곳에 큐의 자료구조 형태로 요청들을 담아둬요.

밑에서부터 차곡차곡 요청을 쌓죠.

요청100

....

요청3

요청2

요청1

그후 요청 1을 비동기로 처리 요청2를 비동기로 처리....................요청 100을 비동기로 처리

이러한 과정을 거쳐서 node.js는 응답을 처리하게 되는거죠.

저는 node를 사용했을때부터 궁금한게 있었는데요. 100만명의 처리가 온다면 이벤트루프에 100만개의 요청을 담고 동기식으로 처리한다해도 과부하가 장난이 아닐텐데....어떤식으로 처리하는걸까?..

옛날에는 c언어로 서버언어를 작성한다면 멀티스레드에 세마포어 걸어두고 막 엄청 힘들게 코딩했겠지만

지금은 좋은 세상에 살고있는것이 node.js를 구동하는 하드웨어가 512cpu 1대일수도 있지만 100대일수도있고

그렇다면 프로세스 수는 엄청나게 만들것이고, 네트워크 회선도 비싼걸쓰고, 운영체제도 redhat 에서 파는 비싼걸쓰고 등 이러한 과정을 거치면 추가적인 트래픽 분산을 할수있겠져.

여기서 트래픽 분산이 가능한이유는

node 에서 pm2같은 모듈을 사용하면

512cpu 100대에 연결된 프로세스들에게 이벤트루프속 요청을 동기식으로 여러개를 처리하게해요.

요청 10001 요청10002 요청 20000

요청1 요청2 요청10000

프로세스1 프로세스2 ................................... 프로세스 10000

대충 이런식으로 요청을 분산해서 처리하는것이죠.

그렇다고 또

아~~ 비싼 서버사용하면 되는구나?ㅋ X

이게 아니라

잘짜여진 프로그램에서도 부족하다면 서버비용을 늘리면 된다. O

이걸 명심하고 개발자에 영역에서 효율적인 코드를 작성하면 된다는것을 인지하면 될것같아요!!!

반응형

from http://090k.tistory.com/160 by ccl(A) rewrite - 2021-09-02 20:26:16