Node의 PM2로 서버를 배포시, 클러스터 모드를 많이 이용하게 될텐데
(Node는 싱글 스레드를 가지기 때문에 멀티 프로세싱이란 개념으로 접근하여 자원을 효율적으로 이용할 수 있게 해주는 것. )
이렇게 클러스터링을 하게 될 경우 클러스터의 인스턴스의 갯수만큼 서버가 올라간다.
이때 만약 배치성 함수를 서버에 적용했다면 인스턴스의 갯수만큼 해당 함수가 실행될 것이다.
여기다가 이중화서버 등을 이용했을 경우 이 실행 함수의 갯수는 두 배로 늘어나게 될 것
예를 들어, 주기적으로 메일을 발송하는 함수를 서버에 내장하게 됐다면,
동시에 같은 메일이 여러 개가 발송될 수 있을 것.
이런 일은 비효율적일 수 있다. (혹은 일어나선 안될 수도..)
이에 대응하여
서버 실행 스크립트를 분리하여 해당 함수를 실행하는 인스턴스를 아예 분리할 수도 있고,
클러스터가 늘어나게 될 경우 클러스터마다 환경 변수를 별도로 설정할 수 있는 옵션도 제공하고 있다.
나는 이번에 이 옵션을 이용해보았다.
아래의 공식 문서를 참고했다.
https://pm2.keymetrics.io/docs/usage/environment/
최소 PM2가 2.5 버전 이상이어야만 사용할 수 있다.
Specific environment variables 라는 항목을 보게 되면,
프로세스별로 다른 점을 만들어 줄 수 있는 NODE_APP_INSTANCE라는 환경 변수가 존재하고, 하나의 프로세스에서만 크론잡을 실행하고 싶다면, process.env.NODE_APP_INSTANCE === '0'으로 이를 구분 하여 실행할 수 있다고 한다.
여러 프로세스는 해당 변수를 동일한 값을 얻을 수 없고
그리고 pm2 restart, pm2 scale 명령어를 실행해도, 이는 유지 된다고 한다.
사용 방법은 간단하다. (node-config에 설정을 하면 되는 듯 한데, 이슈가 있었나봄 이건 내가 사용해보질 않아서 확인을 못했다. )
pm2 실행 스크립트에, instance_var 옵션에 클러스터에 붙여줄 변수의 이름을 적어주는 것이다.
module.exports = {
apps : [
{
name: "myapp",
script: "./app.js",
watch: true,
instance_var: 'INSTANCE_ID',
env: {
"PORT": 3000,
"NODE_ENV": "development"
}
}
]
}
이렇게 사용하게 될 경우 서버실행시, 인스턴스가 몇 번째 인스턴스를 가리키고 있는지 확인이 가능하다.
if(process.env.INSTANCE_ID === '0'){
// do something
}
'Back-end > Node.js' 카테고리의 다른 글
[Node.js] 커스텀 에러 만들기/분석해보자 (0) | 2022.04.09 |
---|---|
Mocha 테스트 후, 테스팅 터미널 종료하기+ Mocha default timeout 시간 재설정 (0) | 2022.03.27 |
Sequelize 사용하기 (0) | 2021.10.18 |
multipart/form-data를 처리하는 패키지 비교 (1) | 2021.10.07 |
Node에서의 Module (0) | 2021.08.09 |