웹 브라우저에 종속적인 자바스크립트에서 외부에서 실행할 수 있는 Runtime 환경을
Chrome V8 엔진을 제공하여 여러 OS 환경에서 실행할 수 있는 환경을 제공한다. 이것을 Node.js 라고 정의할 수 있다고 한다.
동기적인 처리를 할 때 자바스크립트는 컨텍스트 상 호출 스택(선입후출) 구조에서 가장 나중에 처리된 것이 가장 먼저 처리되는 현상을 볼 수 있다.
큐(선입선출)
function first() {
second()
console.log('첫 번째 실행')
}
function second() {
third()
console.log('두 번째 실행')
}
function third() {
console.log('세 번째 실행')
}
first()
멀티스레드를 흉내 낸 정도 ?
모듈 기능을 가지고 기능별 모듈화가 가능하다.
// 참고해야하는 파일
module.exports = {
pool, connectionNonTransaction
};
//모듈을 사용할 때
const {pool, connectionNonTransaction, transaction} = require('../../../config/database'); // 파일 위치
node.js 의 프로세스 매니저 pm2
클러스터 모듈을 사용해 단일 프로세스를 멀티 프로세스로 늘릴 수 있는 방법을 제공한다.
클러스터 모듈을 사용해서, 마스터 프로세스에서 CPU 코어 수만큼 워커 프로세스를 생성해서 모든 코어를 사용하게끔 개발하면 된다.
npm install -g pm2@latest
pm2 start app.js
나는 클러스터 모드로 실행한 경험은 없고 그냥 fork 로만 했다.
그러나 모든 CPU 를 사용하기 위해서는 클러스터 모드로 실행해야 한다.
pm2에 관해 자세히 설명된 라인블로그 참조.
https://engineering.linecorp.com/ko/blog/pm2-nodejs/
어플리케이션의 반영을 위해 재시작 해야한다. reload
그러나 무거운 어플리케이션을 무작정 reload 하게 된다면, 에러에 직면할 수 있다.
그렇다면, 진정한 서비스 무중단 이라고 할 수 없다.
서비스 무중단을 위해서는?
SIGNINT 시그널을 리스닝하다가, 해당 시그널이 전달되면 app.close 명령어로 프로세스가 새로운 요청을 받는 것을 거절하고 기존 연결을 처리하게 둔다.
그 후 사용자 요청을 처리하기 충분한 killtimeout 을 설정하고 기존 유지되고 있던 연결이 종료되면 프로세스가 종료되게 한다.