//node-schedule
Node Schedule 은 cron과 비슷하기도 하고 cron과 비슷하지만은 않은 스케줄러이다. node-schedule은 "특정 작업"을 "특정 반복 조건"에 맞게 스케줄링(예약)할 수 있게 해줍니다.
node-schedule
에서 예약하려는 모든 일들을 "Job" 객체라고 합니다. 직접 job들을 만들 수 있고, schedule()
함수를 이용하여 시간을 설정합니다.
다른 여러 노드 객체들처럼 Job 객체 또한 EventEmitter입니다.!
run
: 각각의 job이 실행된 후에 발생하는 이벤트.scheduled
: 각각의 job이 예약되었을 때의 이벤트.canceled
: 각각의 job이 취소되었을 때의 이벤트.error
: 각각의 job에 에러가 발생했을 때의 이벤트.이미지
const schedule = require('node-schedule');
const job = schedule.scheduleJob('42 * * * *', function(){
console.log('The answer to life, the universe, and everything!');
});
// 매시간 42분에 예약하기. (eg, 19:42, 20:42)
const job = schedule.scheduleJob('0 17 ? * 0,4-6', function(){
console.log('Today is recognized by Rebecca Black!');
});
매우 특정한 시간에 작동시키길 원할 때 이용합니다.
const schedule = require('node-schedule');
const date = new Date(2012, 11, 21, 5, 30, 0);
const job = schedule.scheduleJob(date, function(){
console.log('The world is going to end today.');
});
반복적으로 규칙에 맞게 job을 실행시켜야 한다면 RecurrenceRule()
을 이용하면 됩니다.
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!');
});
타임존 또한 설정가능합니다.
rule.tz = 'ETC/UTC'
기본적으로 node-schedule
은 서버가 꺼지면 사라집니다. 이를 해결할 방법은 여러가지가 있습니다.
cron: OS단에서 예약된 작업을 실행하기때문에 node 서버가 재부팅된 상태여도 예약된 작업들이 살아있습니다.
agenda.js: 작업들을 DB(mongoDB)에 저장하여서 불러오기 때문에 서버가 꺼져도 예약된 작업들이 서버의 살아있음 유뮤 상관없이 작동합니다.
node-schedule: 서버를 실행시키는 코드에 node-schedule 예약 코드를 넣어둡니다. db를 연결하거나, 서버에 필요한 것들을 실행시키는 코드(index.js 파일)에 스케줄링코드까지 집어넣습니다. 그러면 매번 서버가 재실행될때마다 작업이 예약되므로 계속 유지할 수 있습니다.
but 서버를 한개의 instance로만 실행시킬수는 없는 노릇입니다. 이 방식대로 하면 실행되는 모든 node instance에서 실행되므로 중복으로 job이 실행되는 문제가 발생합니다.
pm2: pm2를 이용한다면 서버에 문제가 생겨 멈추어버렸을 때 알아서 다시 시작하게 됩니다.
// pm2 설정에서 특정 인스턴스에게만 scheduling을 하게 한다. process는 같은 번호를 가질수 없으므로 하나의 번호에만 scheduling을 설정하면 한군데에서만 scheduling 작업을 하게 된다.
서버로 들어오는 요청을 하나의 프로세스에서 모두 처리하기는 힘듭니다. 그래서 cpu만큼 프로세스를 만들어 멀티 프로세스로 요청을 처리하게 됩니다. 보통 node로 서버를 구축할 때는 pm2
를 이용하여 여러개의 프로세스를 관리하게 됩니다.
pm2에서는 process마다 번호를 제공해줍니다. 그 번호를 이용하여 특정 process에게만 scheduling을 설정할수 있고, 하나의 프로세스에서만 예약된 작업이 실행되게 할 수 있습니다. node-schedule을 이용하며 아무런 설정도 하지 않는다면 여러 개의 프로세스에서 job을 실행하여 예상하지 못한 일이 발생할 수 있습니다.
https://pm2.keymetrics.io/docs/usage/environment/#node_app_instance-pm2-25-minimum
위 링크를 들어가보시면 pm2 document 자체적으로도 NODE_APP_INSTANCE
변수를 scheduling에 이용하라고 합니다. 다른 이름으로 사용하고 싶다면, pm2.config.js
에서 instance_var
를 설정하시면 됩니다.
module.exports = {
apps : [{
name: 'appName',
script: 'src/index.js',
instance_var: 'INSTANCE_ID', // 편한 이름으로 설정하면 됩니다.
instance: 0,
exec_mode: 'cluster',
min_uptime: 5000,
max_restarts: 5,
args: '',
env:{
NODE_ENV:'production'
}
}],
};
그리고 이 변수를 이용하여 하나의 프로세서에서만 스케줄을 설정하도록 하면 됩니다.
// index.js
~~
if (process.env.INSTANCE_ID == 0) {
// schedule your job here.
}