라벨이 single thread인 게시물 표시

NestJS Cluster를 이용하여 CPU최대로 활용하기

이미지
 NodeJS은 기본적으로 Single Thread입니다. 따라서 하나의 NodJS작업에 많은 작업량이 주어지면 작업량 초과로 에러가 발생할 가능성이 있습니다. 이를 위해 작업량을 분산시켜줄 필요가 있는데 이때 nodejs에서 지원해주는 cluster를 사용합니다. 참고링크 : https://nodejs.org/api/cluster.html#cluster 위 글은 NestJS와 cluster를 이용하여 하나의 서버에서 여러개의 동일한 NestJS를 만들어서 업무를 분산할 것입니다. 새로운 포트를 통해 만드는 것이 아닌 하나의 포트에서 여러개의 동일한 NestJS 쓰레드가 업무를 분산해서 작업을 하는 것입니다. 사진1) cluster 구조 사진1에서와 같이 4개의 코어로 이루어진 CPU가 있는데 각각의 코어에 NestJS1~4까지 실행이 되고 있습니다. 해당 NestJS는 같은 API의 같은 Port으로 연결될수 있습니다. 이때 Client가 API를 통해서 요청을 하면 CPU중 하나의 코어를 선택해서 작업을 수행후 Client으로 응답을 줍니다. 다수의 Client로부터 요청을 받을때 하나의 스레드를 사용하는 것보다 각각의 코어에서 스레드를 생성해서 분산작업하는것이 더욱 안정적입니다.  // src/app-cluster.service.ts import { Injectable } from '@nestjs/common' ; import * as os from 'os' ; const cluster = require ( 'cluster' ); // nodejs의 cluster를 사용 const numCPUs = os . cpus (). length ; // 현재 os의 cpu갯수 확인 @ Injectable () export class AppClusterService { static clusterize ( callback : Function ): void { con...

Node JS의 Non Blocking(논 블로킹)

이미지
 안녕하세요. 이번 포스트는 저번의 싱글스레드의 연장선이라고 보시면 됩니다. 참고 하실분은 이전 글 링크를 참고 해 주시기 바랍니다. Node JS의 싱글스레드 - 1 Node JS의 싱글스레드 - 2 이번 글의 주제는 Non Blocking에 대한 것입니다. 그런데 Non Blocking이전에 일단 Blocking에 대해서 알아야 합니다. 위 그림은 블로킹 상태를 말하는 것입니다. 하나의 스레드에 하나의 작업만 가능하기 때문에 다음 작업을 진행하기 위해서는 현재의 작업이 마무리 되야 되는 것입니다.  하지만 논 블로킹 방식은 요청을 받으면 바로 진행을 하고 끝나는 순서로 Client에 응답을 합니다.  저번 싱글스레드 주제로 이야기 할때 이상한 점이 있었습니다. 점원은 한명인데 어떻게 동시에 여러잔의 커피를 만드는 것에 대한 이야기 입니다. 직원으로 이야기 하면 어렵지만 Node JS에서 이야기가 달라집니다.  서버에서 CPU가 맡은 작업과 IO가 맡은 작업이 있습니다. 이때 Client에서 요청이 들어오면 CPU에서 연산을 하고 완료가 되면 이를 IO쪽으로 넘김니다. 이후 IO에서도 작업이 완료되면 다시 CPU로 보내서 마무리 하고 응답을 하게 됩니다.   NodeJS은 싱글 스레드이기 때문에 하나의 스레드로 모든 요청 작업을 감당해야 합니다. 즉 위의 그림처럼 3개의 Client의 요청이 왔을때 요청 순서 및 작업이 끝나는 순서대로 응답을 보내게 됩니다.  즉 이처럼 논 블로킹을 이용하여 Node JS서버는 상당한 효율을 발휘합니다. 하지만 고사양의 연산이 필요한 어플리케이션 인 경우 CPU에서 다른 연산을 막을수 있기 때문에 효율이 좋지 않다. 즉 상황에 맞게 사용해야 하는 것이다. 

Node JS의 싱글스레드 - 2

이미지
 안녕하세요. 이번에는 싱글 스레드로 동작되는 Node JS에 오래 걸리는 작업의 요청이 들어올때 어떻게 대응하는지를 알아보겠습니다.  이번에도 모든 요청을 받습니다. 그런데 Client2 손님의 요청사항은 다른 손님의 요청에 비해 상당히 깁니다.  일단 요청 사항에 대해서 진행을 하고 가장 짧은 아이스 아메리카노를 Client1 손님한테 드립니다.   그런데 Client2 손님한테 음료를 주는것이 아닌 Client3 손님의 음료를 먼저 줍니다. 이유는 악마의 음료의 시간이 아이스 카페라테에 비해 훨씬 길기 때문에 먼저 완료된 요청사항 순서로 진행이 되기 때문입니다. Client3손님은 Client2손님의 음료가 나올때까지 기다릴 필요없이 완료되자마자 음료를 받을수 있습니다.  이제 마지막 Client2의 손님이 원하는 음료를 받게 됩니다. 이처럼 Node JS는 모든 요청을 다 받지만 그렇다고 요청의 순서대로 응답을 하지 않습니다. 먼저 끝나는 작업 순으로 Node가 응답을 보내는 것입니다.   위 과정을 커피점으로 묘사해서 설명을 했지만 실제로는 생략된 내용이 있습니다. 자세한 내용은 다음 Node JS에 대해서 글을 작성할때 설명 드리겠습니다. 다음글 : Node JS의 Non Blocking(논 블로킹)

Node JS의 싱글스레드 - 1

이미지
 안녕하세요. 알렉스 입니다. 이번에는 Node.JS가 왜 싱글스레드를 채용하고 개념에 대해서 알아보도록 하겠습니다.  일단 스레드를 일종의 직원이라고 보면 됩니다. 스레드가 많을수록 일하는 직원이 많아지는 것인데 Node JS는 단일 스레드를 채택했습니다. 위 그림에서 Client1이 아이스 아메리카를 주문하고 있습니다. 이때 Node직원이 응답을 하고 아이스 아메리카노를 만듭니다. 첫 그림의 메뉴에서 아이스 아메리카노는 약 10초간의 시간이 소요됩니다.  10초가 지난후 Node직원은 아이스 아메리카노를 Client1에 제공을하고 이후 업무를 종류하게 됩니다. 하지만 지금은 단일 client1의 요청이고 복수의 요청이 들어오면 어떻게 될까요? 위 그림처럼 여러 client가 줄지어 요청을 할때 Node가 첫번째 client의 요청을 듣고 작업을 수행한후 완료할때까지 10초가 걸립니다. 그리고 다음 손님또한 요청을 받고 그만큼 시간이 걸립니다. 이때 마지막 손님은 앞의 모든 손님들의 주문이 완료될때까지 기다려야하는데 그렇게 되면 인내심이 바닥나서 가게를 나갈수가 있습니다.  일단 주문을 한꺼번에 받습니다. 그리고 바로 받은 요청에 대해서 작업을 실행합니다.   첫 줄의 손님은 아이스 아메리카노를 요청했기 때문에 10초만에 음료가 준비 됩니다. 두번째, 세번째 손님도 주문한 순서대로 음료를 받게 됩니다. 하지만 중간에 상당히 오래 걸리는 주문을 하게 되면 어떻게 될까요. 순차적으로 주문을 받는데 중간에 악마의 음료를 주문해서 그 뒤로 주문한 사람이 오랫동안 기다려야 할까요? 이 내용은 다음 블로그 글에서 알려드리도록 하겠습니다. 다음글 : Node JS의 싱글스레드 -2