iT邦幫忙

2022 iThome 鐵人賽

DAY 7
0
Modern Web

身為 Node.js 開發者,可以知道一下的事系列 第 7

[Day 7] 設定排程任務的工具 - node-cron

  • 分享至 

  • xImage
  •  

常常我們在工作時會需要排程跑一些任務例如每天半夜需要跑統計報表,或是批量更新抓取資料之類的,一些比較例行性的工作,或是未來可預期的工作。

這種時候就可以使用今天要提到的這個工具 node-cron


原本怎麼做

一般來說如果我們要解決上述的問題,以前很常見的做法是使用 linux 系統內建的 crontab 指令來達到這件事。
可以參考以下這篇 LI-EDWARD 大大的文章

在 crontab 中設定 cron-express,可以讓我們在想要的時間,觸發直接執行腳本或直接用 wget 指令來打 http endpoint 來直接執行 api 邏輯。

0 0 * * * /home/ubuntu/script.sh  //每天凌晨 00:00 執行腳本 script.sh

但以上做法有什麼缺點呢?
今天假設我們所執行的業務邏輯是跟服務綁定再一起的時候,假設服務進行遷移或是 endpoint 改變,我們需要重新去修改 crontab 設定。
並且今天如果要做主機擴展時,也需要去注意是否每一台主機都會吃到 crontab 的設定,如果重複執行那也是一件蠻尷尬的事。


node-cron

var CronJob = require('cron').CronJob;
var job = new CronJob(
	'* * * * * *',
	function() {
		console.log('You will see this message every second');
	},
	null,
	true,
	'America/Los_Angeles'
);

該套件在官網有清楚的用法介紹,至於跟 crontab 比起來有什麼好處呢?我覺得有以下幾點:

  • 排程管理程式化(可透過版控管理及遷移排程邏輯和設定,並且可以設定時區,無需在意主機時區。)
  • 配合 pm2 可以單獨指定某個 instance 去執行排程。如果真的有特殊需求,也可以讓多個 instance 去跑排程分擔任務。
  • 並且因為是透過程式驅動,若是在初始化 new crontab 的過程中,也透過程式去做一些判斷,可以做到類似根據時間日期設定去執行一次性任務的功能。

總而言之,就是可以擁有更高的靈活性。


上一篇
[Day 6] 如何了解 JS 及 Node 生態系
下一篇
[Day 8] 利用 Task Queue 分散式處理非同步任務 - Bull
系列文
身為 Node.js 開發者,可以知道一下的事9
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言