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
'nodejs' 카테고리의 다른 글
[node.js] node version manager (nvm) for window / 노드 버전 업데이트 윈도우 (3) | 2024.10.21 |
---|---|
[Node.js] __dirname / process.cwd() (0) | 2022.11.03 |
[Node.js] pm2, 왜 쓸까? (0) | 2022.09.18 |
5.12 (0) | 2021.05.12 |
5.11 login 체크/ pw 체크/아이디 중복확인/ 이미지 올리기/ (0) | 2021.05.11 |