基於agenda的Nodejs定時任務管理框架搭建

0、背景

  在大型項目中,定時任務的應用場景愈來愈廣。通常來講,按照微服務的思想,咱們會將定時任務單獨部署一套服務,核心的業務接口獨立到另外一個服務中,從而下降相互之間的耦合程度。在須要使用定時任務時,只須要由定時任務微服務定時向核心業務服務發起異步接口調用。node

  基於NodeJS來搭建這樣一套定時任務的話,咱們可使用現有比較成熟的第三方框架來快速搭建,開發人員只須要關注定時任務的實現邏輯便可。git

 

一、agenda

  在github搜索nodejs schedule的話會有不少類庫,好比node-schedule,agenda,node-cron等。之因此選擇agenda的話主要由兩個緣由:一、agenda接口簡單,還可以使用人類可讀的cron表達式;二、agenda提供了完整的Restful API接口,以及可統計查看操做的UI界面。github

  這樣的話,咱們只要在代碼中提早定義好定時任務處理邏輯,而後就能夠在界面在新增或者移除定時任務安排,而無需從新上線。web

  下面咱們就開始從頭搭建基於agenda的定時任務。mongodb

 

二、基礎環境準備

  • MongoDB:agenda須要使用MongoDB來存儲定時任務數據。建議你們使用docker進行一建安裝,操做簡單,刪除也方便。只須要docker中搜索mongo,選擇安裝默認推薦的官方版便可。
  • agenda:定時任務管理框架,文檔參考:https://github.com/agenda/agenda
  • agendash:基於agenda的UI管理界面,文檔參考:https://github.com/agenda/agendash
  • express:用於配合agendash啓動WEB服務
  • nirvana-logger:非必選,nodejs日誌輸出框架,文檔參考:https://www.npmjs.com/package/nirvana-logger

 

三、樣例代碼

 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 // 定義一個測試任務
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行:定義一個任務,名稱爲testJob,後續咱們能夠經過該名字安排定時任務。第二個參數是一個函數,用於處理咱們的業務邏輯,須要注意的是,咱們須要在任務完成以後主動調用done方法,這樣agenda纔會將任務標記爲完成。docker

17行:若是任務執行過程當中出現異常(好比網絡請求異常)時,須要向done傳入一個error對象,agenda會將此任務標記爲fail狀態。數據庫

23行:在agenda鏈接MongoDB成功後,會觸發ready的鉤子,咱們才能在這裏開始安排定時任務,而且讓agenda開始執行定時任務掃描。express

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

 

執行node命令啓動該js文件,若是能在命令行看到「agenda啓動成功」則表示agenda鏈接數據庫成功而且成功啓動。網絡

 

其實細心的同窗能夠,咱們在上面的代碼中只是定義了任務,可是並無對進行對任務進行定時運行。

因此接下來咱們將演示如何在WEB界面上對定時任務進進行查詢,新增以及刪除的操做。

如今咱們能夠打開:http://localhost:3000/dash/# 來查看web界面。

 

四、定時任務界面管理

打開agendash的默認界面是這樣

 

從界面上也能夠看出,咱們如今的確並未啓動任何定時任務。

 

4.1 新增定時任務

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

 Job name:咱們須要使用的任務名稱,即咱們在程序中提早設置好的任務,好比剛纔定義的testJob

Schedule:安排定時任務,這裏咱們輸入但願定時任務執行的時間點,好比5 minutes。這裏時間的支持具體請參考:https://github.com/agenda/human-interval

Repeat every:循環執行定時任務,這裏輸入循環間隔時間。好比5 seconds。這裏須要注意的是schedule安排的任務只會執行一次,repeat任務會一直循環執行。因此這兩者通常只須要按需求填一個便可。

Job data:向定時任務傳入的額外數據,咱們能夠在任務執行時經過job.attr.data獲取到這些參數。

點擊保存後,咱們的定時任務就開始運行,能夠看到控制檯開始循環執行打印日誌:

同時WEB界面數據將會更新,咱們也能看到定時任務的運行狀態:

schedule安排一次性的定時任務也是相似的操做,你們能夠本身嘗試。

值得注意的是,咱們定義的任務,是能夠被重複執行定時任務。

 

4.2 移除定時任務

點擊某一個定時任務,就能查看到任務的詳細信息以及相關操做。

點擊右上角的【delete selected】便可刪除該定時任務。 

 

 

五、幾個注意點

  • 定時任務的時間除了使用cron表達式之外,還只能簡單的英文表達,具體要參考https://github.com/agenda/human-interval
  • 定時任務在執行過程當中會將設置爲鎖定狀態,任務執行完成之後再將任務鎖定狀態解除。因此若是任務在執行過程當中,程序退出的話,那麼就會致使任務一直處於鎖定狀態,agenda默認10分鐘後自動解鎖任務。
  • 爲避免定時任務重複執行,通常來說定時任務微服務咱們只須要部署一個實例便可。核心的業務接口處於負載均衡的考慮,能夠按業務量多部署幾個實例。
相關文章
相關標籤/搜索