基于agenda的Nodejs定时任务管理框架搭建
0、背景
在大型項(xiàng)目中,定時(shí)任務(wù)的應(yīng)用場(chǎng)景越來越廣。一般來說,按照微服務(wù)的思想,我們會(huì)將定時(shí)任務(wù)單獨(dú)部署一套服務(wù),核心的業(yè)務(wù)接口獨(dú)立到另一個(gè)服務(wù)中,從而降低相互之間的耦合程度。在需要使用定時(shí)任務(wù)時(shí),只需要由定時(shí)任務(wù)微服務(wù)定時(shí)向核心業(yè)務(wù)服務(wù)發(fā)起異步接口調(diào)用。
基于NodeJS來搭建這樣一套定時(shí)任務(wù)的話,我們可以使用現(xiàn)有比較成熟的第三方框架來快速搭建,開發(fā)人員只需要關(guān)注定時(shí)任務(wù)的實(shí)現(xiàn)邏輯即可。
1、agenda
在github搜索nodejs schedule的話會(huì)有很多類庫(kù),比如node-schedule,agenda,node-cron等。之所以選擇agenda的話主要由兩個(gè)原因:1、agenda接口簡(jiǎn)單,還可使用人類可讀的cron表達(dá)式;2、agenda提供了完整的Restful API接口,以及可統(tǒng)計(jì)查看操作的UI界面。
這樣的話,我們只要在代碼中提前定義好定時(shí)任務(wù)處理邏輯,然后就可以在界面在新增或者移除定時(shí)任務(wù)安排,而無需重新上線。
下面我們就開始從頭搭建基于agenda的定時(shí)任務(wù)。
2、基礎(chǔ)環(huán)境準(zhǔn)備
MongoDB:agenda需要使用MongoDB來存儲(chǔ)定時(shí)任務(wù)數(shù)據(jù)。建議大家使用docker進(jìn)行一建安裝,操作簡(jiǎn)單,刪除也方便。只需要docker中搜索mongo,選擇安裝默認(rèn)推薦的官方版即可。
agenda:定時(shí)任務(wù)管理框架,文檔參考:https://github.com/agenda/agenda
agendash:基于agenda的UI管理界面,文檔參考:https://github.com/agenda/agendash
express:用于配合agendash啟動(dòng)WEB服務(wù)
nirvana-logger:非必選,nodejs日志輸出框架,文檔參考:https://www.npmjs.com/package/nirvana-logger
3、樣例代碼
1 // 框架引入
2 var express = require('express');
3 var app = express();
4
5 var Agenda = require('agenda');
6 var Agendash = require('agendash');
7 var L = require('nirvana-logger')('agenda')
8
9 // agenda初始化,并連接MongoDB
10 var agenda = new Agenda({db: {address: 'mongodb://localhost:32768/agenda'}});
11
12 // 定義一個(gè)測(cè)試任務(wù)
13 agenda.define('testJob', function (job, done) {
14 try {
15 L('hello',job.attrs.data, new Date())
16 done()
17 }catch (err) {
18 done(new Error(err))
19 }
20 })
21
22 // agenda框架啟動(dòng)
23 agenda.on('ready', function () {
24 L("====>>>agenda啟動(dòng)成功<<<<===")
25 agenda.start();
26 })
27
28 // Agendash UI界面
29 app.listen(3000);
30 app.use('/dash', Agendash(agenda));
13行:定義一個(gè)任務(wù),名稱為testJob,后續(xù)我們可以通過該名字安排定時(shí)任務(wù)。第二個(gè)參數(shù)是一個(gè)函數(shù),用于處理我們的業(yè)務(wù)邏輯,需要注意的是,我們需要在任務(wù)完成之后主動(dòng)調(diào)用done方法,這樣agenda才會(huì)將任務(wù)標(biāo)記為完成。
17行:如果任務(wù)執(zhí)行過程中出現(xiàn)異常(比如網(wǎng)絡(luò)請(qǐng)求異常)時(shí),需要向done傳入一個(gè)error對(duì)象,agenda會(huì)將此任務(wù)標(biāo)記為fail狀態(tài)。
23行:在agenda連接MongoDB成功后,會(huì)觸發(fā)ready的鉤子,我們才能在這里開始安排定時(shí)任務(wù),并且讓agenda開始執(zhí)行定時(shí)任務(wù)掃描。
29行:在3000端口啟動(dòng)express,同時(shí)使用agendash框架啟動(dòng)agenda的WEB管理界面。
執(zhí)行node命令啟動(dòng)該js文件,如果能在命令行看到“agenda啟動(dòng)成功”則表示agenda連接數(shù)據(jù)庫(kù)成功并且成功啟動(dòng)。
其實(shí)細(xì)心的同學(xué)可以,我們?cè)谏厦娴拇a中只是定義了任務(wù),但是并沒有對(duì)進(jìn)行對(duì)任務(wù)進(jìn)行定時(shí)運(yùn)行。
所以接下來我們將演示如何在WEB界面上對(duì)定時(shí)任務(wù)進(jìn)進(jìn)行查詢,新增以及刪除的操作。
現(xiàn)在我們可以打開:http://localhost:3000/dash/來查看web界面。
4、定時(shí)任務(wù)界面管理
打開agendash的默認(rèn)界面是這樣
從界面上也可以看出,我們現(xiàn)在的確并未啟動(dòng)任何定時(shí)任務(wù)。
4.1 新增定時(shí)任務(wù)
點(diǎn)擊【Schedule job】,在后面彈出create job界面:
Job name:我們需要使用的任務(wù)名稱,即我們?cè)诔绦蛑刑崆霸O(shè)置好的任務(wù),比如剛才定義的testJob
Schedule:安排定時(shí)任務(wù),這里我們輸入希望定時(shí)任務(wù)執(zhí)行的時(shí)間點(diǎn),比如5 minutes。這里時(shí)間的支持具體請(qǐng)參考:https://github.com/agenda/human-interval
Repeat every:循環(huán)執(zhí)行定時(shí)任務(wù),這里輸入循環(huán)間隔時(shí)間。比如5 seconds。這里需要注意的是schedule安排的任務(wù)只會(huì)執(zhí)行一次,repeat任務(wù)會(huì)一直循環(huán)執(zhí)行。所以這二者一般只需要按需求填一個(gè)即可。
Job data:向定時(shí)任務(wù)傳入的額外數(shù)據(jù),我們可以在任務(wù)執(zhí)行時(shí)通過job.attr.data獲取到這些參數(shù)。
點(diǎn)擊保存后,我們的定時(shí)任務(wù)就開始運(yùn)行,可以看到控制臺(tái)開始循環(huán)執(zhí)行打印日志:
同時(shí)WEB界面數(shù)據(jù)將會(huì)更新,我們也能看到定時(shí)任務(wù)的運(yùn)行狀態(tài):
schedule安排一次性的定時(shí)任務(wù)也是類似的操作,大家可以自己嘗試。
值得注意的是,我們定義的任務(wù),是可以被重復(fù)執(zhí)行定時(shí)任務(wù)。
4.2 移除定時(shí)任務(wù)
點(diǎn)擊某一個(gè)定時(shí)任務(wù),就能查看到任務(wù)的詳細(xì)信息以及相關(guān)操作。
點(diǎn)擊右上角的【delete selected】即可刪除該定時(shí)任務(wù)。
5、幾個(gè)注意點(diǎn)
定時(shí)任務(wù)的時(shí)間除了使用cron表達(dá)式以外,還只能簡(jiǎn)單的英文表達(dá),具體要參考https://github.com/agenda/human-interval
定時(shí)任務(wù)在執(zhí)行過程中會(huì)將設(shè)置為鎖定狀態(tài),任務(wù)執(zhí)行完成以后再將任務(wù)鎖定狀態(tài)解除。所以如果任務(wù)在執(zhí)行過程中,程序退出的話,那么就會(huì)導(dǎo)致任務(wù)一直處于鎖定狀態(tài),agenda默認(rèn)10分鐘后自動(dòng)解鎖任務(wù)。
為避免定時(shí)任務(wù)重復(fù)執(zhí)行,一般來講定時(shí)任務(wù)微服務(wù)我們只需要部署一個(gè)實(shí)例即可。核心的業(yè)務(wù)接口處于負(fù)載均衡的考慮,可以按業(yè)務(wù)量多部署幾個(gè)實(shí)例。
總結(jié)
以上是生活随笔為你收集整理的基于agenda的Nodejs定时任务管理框架搭建的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TP3.2设置URL伪静态满足更好的SE
- 下一篇: imageView图片放大缩小及旋转