日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

基于agenda的Nodejs定时任务管理框架搭建

發(fā)布時間:2023/12/13 综合教程 31 生活家
生活随笔 收集整理的這篇文章主要介紹了 基于agenda的Nodejs定时任务管理框架搭建 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

0、背景

  在大型項目中,定時任務(wù)的應(yīng)用場景越來越廣。一般來說,按照微服務(wù)的思想,我們會將定時任務(wù)單獨部署一套服務(wù),核心的業(yè)務(wù)接口獨立到另一個服務(wù)中,從而降低相互之間的耦合程度。在需要使用定時任務(wù)時,只需要由定時任務(wù)微服務(wù)定時向核心業(yè)務(wù)服務(wù)發(fā)起異步接口調(diào)用。

  基于NodeJS來搭建這樣一套定時任務(wù)的話,我們可以使用現(xiàn)有比較成熟的第三方框架來快速搭建,開發(fā)人員只需要關(guān)注定時任務(wù)的實現(xiàn)邏輯即可。

1、agenda

  在github搜索nodejs schedule的話會有很多類庫,比如node-schedule,agenda,node-cron等。之所以選擇agenda的話主要由兩個原因:1、agenda接口簡單,還可使用人類可讀的cron表達(dá)式;2、agenda提供了完整的Restful API接口,以及可統(tǒng)計查看操作的UI界面。

  這樣的話,我們只要在代碼中提前定義好定時任務(wù)處理邏輯,然后就可以在界面在新增或者移除定時任務(wù)安排,而無需重新上線。

  下面我們就開始從頭搭建基于agenda的定時任務(wù)。

2、基礎(chǔ)環(huán)境準(zhǔn)備

MongoDB:agenda需要使用MongoDB來存儲定時任務(wù)數(shù)據(jù)。建議大家使用docker進(jìn)行一建安裝,操作簡單,刪除也方便。只需要docker中搜索mongo,選擇安裝默認(rèn)推薦的官方版即可。
agenda:定時任務(wù)管理框架,文檔參考:https://github.com/agenda/agenda
agendash:基于agenda的UI管理界面,文檔參考:https://github.com/agenda/agendash
express:用于配合agendash啟動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 // 定義一個測試任務(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框架啟動
23 agenda.on('ready', function () {
24   L("====>>>agenda啟動成功<<<<===")
25   agenda.start();
26 })
27 
28 // Agendash UI界面
29 app.listen(3000);
30 app.use('/dash', Agendash(agenda));

13行:定義一個任務(wù),名稱為testJob,后續(xù)我們可以通過該名字安排定時任務(wù)。第二個參數(shù)是一個函數(shù),用于處理我們的業(yè)務(wù)邏輯,需要注意的是,我們需要在任務(wù)完成之后主動調(diào)用done方法,這樣agenda才會將任務(wù)標(biāo)記為完成。

17行:如果任務(wù)執(zhí)行過程中出現(xiàn)異常(比如網(wǎng)絡(luò)請求異常)時,需要向done傳入一個error對象,agenda會將此任務(wù)標(biāo)記為fail狀態(tài)。

23行:在agenda連接MongoDB成功后,會觸發(fā)ready的鉤子,我們才能在這里開始安排定時任務(wù),并且讓agenda開始執(zhí)行定時任務(wù)掃描。

29行:在3000端口啟動express,同時使用agendash框架啟動agenda的WEB管理界面。

執(zhí)行node命令啟動該js文件,如果能在命令行看到“agenda啟動成功”則表示agenda連接數(shù)據(jù)庫成功并且成功啟動。

其實細(xì)心的同學(xué)可以,我們在上面的代碼中只是定義了任務(wù),但是并沒有對進(jìn)行對任務(wù)進(jìn)行定時運行。

所以接下來我們將演示如何在WEB界面上對定時任務(wù)進(jìn)進(jìn)行查詢,新增以及刪除的操作。

現(xiàn)在我們可以打開:http://localhost:3000/dash/來查看web界面。

4、定時任務(wù)界面管理

打開agendash的默認(rèn)界面是這樣

從界面上也可以看出,我們現(xiàn)在的確并未啟動任何定時任務(wù)。

4.1 新增定時任務(wù)

點擊【Schedule job】,在后面彈出create job界面:

Job name:我們需要使用的任務(wù)名稱,即我們在程序中提前設(shè)置好的任務(wù),比如剛才定義的testJob

Schedule:安排定時任務(wù),這里我們輸入希望定時任務(wù)執(zhí)行的時間點,比如5 minutes。這里時間的支持具體請參考:https://github.com/agenda/human-interval

Repeat every:循環(huán)執(zhí)行定時任務(wù),這里輸入循環(huán)間隔時間。比如5 seconds。這里需要注意的是schedule安排的任務(wù)只會執(zhí)行一次,repeat任務(wù)會一直循環(huán)執(zhí)行。所以這二者一般只需要按需求填一個即可。

Job data:向定時任務(wù)傳入的額外數(shù)據(jù),我們可以在任務(wù)執(zhí)行時通過job.attr.data獲取到這些參數(shù)。

點擊保存后,我們的定時任務(wù)就開始運行,可以看到控制臺開始循環(huán)執(zhí)行打印日志:

同時WEB界面數(shù)據(jù)將會更新,我們也能看到定時任務(wù)的運行狀態(tài):

schedule安排一次性的定時任務(wù)也是類似的操作,大家可以自己嘗試。

值得注意的是,我們定義的任務(wù),是可以被重復(fù)執(zhí)行定時任務(wù)。

4.2 移除定時任務(wù)

點擊某一個定時任務(wù),就能查看到任務(wù)的詳細(xì)信息以及相關(guān)操作。

點擊右上角的【delete selected】即可刪除該定時任務(wù)。

5、幾個注意點

定時任務(wù)的時間除了使用cron表達(dá)式以外,還只能簡單的英文表達(dá),具體要參考https://github.com/agenda/human-interval
定時任務(wù)在執(zhí)行過程中會將設(shè)置為鎖定狀態(tài),任務(wù)執(zhí)行完成以后再將任務(wù)鎖定狀態(tài)解除。所以如果任務(wù)在執(zhí)行過程中,程序退出的話,那么就會導(dǎo)致任務(wù)一直處于鎖定狀態(tài),agenda默認(rèn)10分鐘后自動解鎖任務(wù)。
為避免定時任務(wù)重復(fù)執(zhí)行,一般來講定時任務(wù)微服務(wù)我們只需要部署一個實例即可。核心的業(yè)務(wù)接口處于負(fù)載均衡的考慮,可以按業(yè)務(wù)量多部署幾個實例。

總結(jié)

以上是生活随笔為你收集整理的基于agenda的Nodejs定时任务管理框架搭建的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。