nodejs

[node.js] schedule.scheduleJob - pm2 클러스터 모드 사용시 코드 중복적용 문제

문앵 2022. 10. 20. 18:27

schedule.scheduleJob은 이용하면 주기적으로 같은 로직을 실행해야 할때 유용하게 쓰인다.

예를 들어 내가 하고 있는 프로젝트에서처럼 정산 배치가 돌아야 할때
-> 매달 15일 마다 그 전달의 계산 내역을 쭉 계산해서 정산해준다.


그럼 한달마다 같은 정산 로직이 반복되어야 하는데, 이걸 배치가 돈다고 하고 이럴때 schedule.scheduleJob을 이용한다.

근데 작업을 다 완료하고 에러가 나지 않는것까지 모두 확인한 뒤에 , 올리고 정산날이 되니까!? 데이터가 이상했다.

같은 데이터가 4번씩 반복해서 들어가 있는것 이다.
원인을 파악해보니 , 운영서버에서는 pm2를 이용해서 node.js를 관리하고 있었고 총 4개의 프로세스로 cluster모드로 사용중이었다.

그래서 데몬이 4개돌아가니까 15일이 되자 각 데몬이 한번씩 정산 로직을 수행했고 4개의 배치가 돌게 된 것임.


해결법은 간단했다. pm2 공식문서에 따르면

process.env.NODE_APP_INSTANCE === '0'


위 식을 이용해서 클러스터 모드시 데몬을 구분할 수 있었다.

신기한 점은 그냥 process.env.NODE_APP_INSTANCE 만 값을 찍어보면 undefined가 뜬다는 것이다.
처음에 그냥 데몬별로 값이 어떻게 들어있는지 궁금해서 하나씩 찍어보려했던건데 undefined가 떠서

뭔가 설정 문제인 줄 알았다.

 


이것 때문에 꽤 몇시간 끙끙 대다가, 그냥 홈페이지 예제처럼 ===0 으로 비교식으로 찍어보니 불리언으로 리턴이 되었다 ㅋㅋㅋ
넘나 어이없고 황당한 순간.

좀 더 읽어보니 , pm2 클러스터 모드에서는 process.env.NODE_APP_INSTANCE의 값이 두개 이상 0 일수 없다고 나와 있었다.
그래서 0이냐 아니냐로만 구분이 되는것 같았다.

 

[ 221129 수정]

ecosystem.config 파일에서 아래 나온 예시처럼 instance_var 옵션을 이용해준 경우 그 이름대로 콘솔에 찍으니 그 값을 알 수 있었다. 그래서 원하는 노드에서 특정 한수를 실행시키는것도 가능했다.

이렇게 각각 

process.env.INSTANCE_ID ::: [ 노드 아이디 값 ]

이라고 나온다

 

 


그래서 결론은

if(process.env.NODE_APP_INSTANCE === '0'){
	//이 안에 배치함수
}

이렇게 써주니 하나의 데몬에서만 배치가 돌아서 , 중복 정산 되는걸 막을 수 있었다 ! ^0^



그리고 process.env.NODE_APP_INSTANCE 라는 내장 변수가 너무 긴것 같으면 , 원하는 이름으로 설정해줄 수 도 있다.
이건 pm2 설정 파일에서 수정해줘야 한다.

이르케 ~
instance_var : '블라블라',
적어주면
process.env.블라블라 라고 써줄수 있다.





참고 : 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



반응형