基于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分钟后自动解锁任务。
  • 为避免定时任务重复执行,通常来说定时任务微服务咱们只须要部署一个实例便可。核心的业务接口处于负载均衡的考虑,能够按业务量多部署几个实例。
相关文章
相关标签/搜索