node를 이용하다보면 스케줄러를 이용할 일이 있는데 node 같은 경우엔 cron 사용방법을 구현한 라이브러리들이 인기가 많은 것 같다. 그 둘에 대한 비교 자료가 없어서 간단하게 비교하는 이야길 해보자.
1. os 스케줄러( cron) vs node 스케줄러
OS 스케줄러를 사용하게 되면 윈도우, 맥, 리눅스 os 별로 별도 스케줄러를 등록하고 관리해야 하는 단점이 있다. 대신 node 스케줄러보다 조금 더 안정적일 수 있고, 불필요하게 별도 스케줄러 프로세스를 띄우지 않아도 되니 리소스도 낭비 되지 않을 것이다. 또 node 프로세스가 죽는 경우 스케줄러 자체가 동작되지 않는 문제도 미연에 방지 할수 있다.
하지만 node 프로세스 관리 라이브러리인 pm2나 forever 같은 것까지 사용하게 되면 프로세스 안전성은 거의 문제가 없고 os 별 별도 설정을 하지 않고, 관리 포인트도 모이게 된다. 리소스 낭비에 관련되서도 노드 스케줄러는 극히 낮은 메모리를 사용하는 것으로 확인했다.
다음은 노드 스케줄러 기본 프로세스만 1초 단위로 관리 되도록 띄워놓은 상태다. 다른 작업 없이 node-cron만 띄운것이 메모리 32mb를 사용하고 node-schedule은 37mb 를 사용한다. node 프로세스 관리인 pm2와 node-cron 을 조합하는 것을 추천한다.
2. node-cron vs node-schedule
사실 둘 중에 뭘 사용하나 스케줄러로 사용하기에 훌륭할 것이다. 개인적으로 node-cron은 1년 넘게 굴려봤지만 문제가 된적도 한번도 없었고 아주 약소하지만 메모리도 5mb정도가 더 많이 사용된다.
test로 setTimeout을 이용한 대기상태를 pm2로 메모리 사용량을 보니 node-cron이 정말 사용하는 메모리가 적다는 생각이 든다. 참고사항으로 세가지 테스트 프로그램은 정말 단순한 내용이다.
test_node-cron.js
var cron = require('node-cron');
cron.schedule('* * * * * *', () => {
console.log('running a task every minute 1');
});
cron.schedule('*/3 * * * * *', () => {
console.log('running a task every minute 2');
});
test_node-schedule.js
var cron = require('node-schedule');
cron.scheduleJob('* * * * * *', () => {
console.log('running a task every minute 1');
});
cron.scheduleJob('*/3 * * * * *', () => {
console.log('running a task every minute 1');
});
test_setTimeout.js
setTimeout( () => { console.log("end...");} , 300000000);
이 세가지를 pm2로 띄운 뒤에 메모리 사용량을 확인해본 거다.
node-schedule 다양한 기능 지원
이런식으로 노드 문법을 통한 설정 기능이 가능해서 복잡한 스케줄 기능이 필요하다면 node-schedule을 사용할 것을 고려할수도 있겠다.
const schedule = require('node-schedule');
const rule = new schedule.RecurrenceRule();
rule.minute = 42;
const job = schedule.scheduleJob(rule, function(){
console.log('The answer to life, the universe, and everything!');
});
const rule2 = new schedule.RecurrenceRule();
rule.dayOfWeek = [0, new schedule.Range(4, 6)];
rule.hour = 17;
rule.minute = 0;
const job2 = schedule.scheduleJob(rule2, function(){
console.log('Today is recognized by Rebecca Black!');
});
const rule3 = new schedule.RecurrenceRule();
rule.hour = 0;
rule.tz = 'Etc/UTC';
const job3 = schedule.scheduleJob(rule3, function(){
console.log('A new day has begun in the UTC timezone!');
});
3. 결론.
node pm2 와 node-cron을 사용하려고 한다. 내가 사용하려는 노드 스케줄러는 node-cron으로도 충분하고 프로세스가 죽는 문제는 pm2가 안정적으로 관리해줄테니까.
'dev > node.js' 카테고리의 다른 글
node.js : self signed certificate in certificate chain 해결방법 (0) | 2022.04.26 |
---|---|
형태소 분석(node.js, mecab) (0) | 2021.07.10 |
These dependencies were not found - tls, net in ./node_modules/.../...js (0) | 2021.05.10 |
nuxt.js + vuetify 개발 환경 설정하는 방법 (0) | 2021.03.31 |
헤로쿠(heroku) don't sleep, 잠들지마~(with node-cron) (3) | 2021.01.13 |
헤로쿠(heroku) 가입부터 node.js 배포까지 (5) | 2021.01.13 |
vscode node.js 실행(launch.json 및 env 설정) (0) | 2020.04.25 |
Nodejs 8+ Cannot debug JavaScript via Nodeclipse (Failed to connect to Standalone V8 VM) (2) | 2020.01.03 |