[Node.js] PM2 Clustering(클러스터링) 시 특정 instance 지칭하기

Back-end/Node.js

[Node.js] PM2 Clustering(클러스터링) 시 특정 instance 지칭하기

조커린 2022. 5. 1. 17:10

Node의 PM2로 서버를 배포시, 클러스터 모드를 많이 이용하게 될텐데
(Node는 싱글 스레드를 가지기 때문에 멀티 프로세싱이란 개념으로 접근하여 자원을 효율적으로 이용할 수 있게 해주는 것. )

이렇게 클러스터링을 하게 될 경우 클러스터의 인스턴스의 갯수만큼 서버가 올라간다. 

 

이때 만약 배치성 함수를 서버에 적용했다면 인스턴스의 갯수만큼 해당 함수가 실행될 것이다.
여기다가 이중화서버 등을 이용했을 경우 이 실행 함수의 갯수는 두 배로 늘어나게 될 것

예를 들어, 주기적으로 메일을 발송하는 함수를 서버에 내장하게 됐다면,
동시에 같은 메일이 여러 개가 발송될 수 있을 것.
이런 일은 비효율적일 수 있다. (혹은 일어나선 안될 수도..)

이에 대응하여
서버 실행 스크립트를 분리하여 해당 함수를 실행하는 인스턴스를 아예 분리할 수도 있고,
클러스터가 늘어나게 될 경우 클러스터마다 환경 변수를 별도로 설정할 수 있는 옵션도 제공하고 있다.
나는 이번에 이 옵션을 이용해보았다.

아래의 공식 문서를 참고했다.
https://pm2.keymetrics.io/docs/usage/environment/

 

PM2 - Environment Variables

Advanced process manager for production Node.js applications. Load balancer, logs facility, startup script, micro service management, at a glance.

pm2.keymetrics.io

최소 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
}