使用Kue排队作业

向开发人员询问有关Redis的信息,大多数人会告诉您这是键/值存储。 然而,不仅如此; 这也是实现作业队列的非常有用的机制。

将工作单元封装为作业有很多优点:

  • 作业可以在后台运行 。 在Web应用程序的上下文中,这意味着您可以处理请求而无需等待作业完成。
  • 您可以延迟作业的执行 ,将其搁置以在以后的日期或时间运行。
  • 作业可以在 “主”应用程序不同的上下文中运行,可以是不同的进程或线程,环境甚至是不同的服务器。
  • 如果作业失败,则可以将应用程序配置为多次重试
  • 您还可以优先处理作业 。 假设您急需通过电子邮件发送故障通知,同时您的应用程序正在发送大量新闻通讯。 设置较高的优先级,可以说“它将跳到队列的最前面”。
  • 许多队列实现还提供了监视作业的能力; 它们的状态-例如,它们是成功还是失败,或者正在等待重试-以及监视长时间运行的作业的进度。

现在,我们已经了解了作业的一些优点,让我们看一下在Node.js应用程序中实现作业的一种方法; 使用K。

介绍K

Kue是一个Node.js程序包,它提供了Redis队列的抽象级别,并提供了一些有用的工具来监视您的作业。

从最基本的角度来看,Kue允许您将代码单位定义为作业,并且在幕后将其放置在Redis队列上的必要信息(运行内容以及运行数据)。 然后,工人负责实际运行这些工作。

前提条件

要使用Kue,您需要安装Node.js和npm,当然,还需要安装和配置Redis。 我们假设您在本地主机(127.0.0.1)上安装了Redis,并在默认端口6379上进行侦听,但是您当然可以适当地配置它。

安装

使用npm安装Kue:

  NPM安装k 

然后,您将需要它:

  var kue = require('kue'); 

创建工作

在创建作业之前,您需要创建一个队列实例:

  var queue = kue.createQueue(); 

还有许多其他选项,例如命名队列和覆盖默认的Redis连接设置。 有关更多详细信息,请查阅文档。

现在让我们通过在新创建的队列上调用create()方法来创建作业。 第一个参数标识作业的类型,第二个参数将任何其他数据作为哈希传递。 然后必须将作业保存到队列中。 这是一个例子:

  queue.create('email',{ 
标题:“欢迎使用该网站”
,发送至:“ user@example.com”
,模板:“ welcome-email”
})。保存();

设定优先级

默认情况下,队列设置为“普通”优先级,这意味着将以标准FIFO(先进先出)的方式处理队列。 如您所料,较高的优先级意味着作业将跳入队列,而对于低优先级的作业则相反。

优先级由数字或名称定义; 名称只是映射到数值的常量,如下所示:

常量值低10标准0中5高10临界15

请注意,数值越低,优先级越高。

设置优先级很容易; 只需在保存之前调用作业的priority()方法即可。 请提供一个数值:

  queue.create(..)。priority(-10).save(); 

…或一个字符串,请参考上表:

  queue.create(..)。priority('high')。save(); 

重试失败的作业

默认情况下,如果作业失败,则不会重新运行。 但是,如果您提供最大尝试次数,则将重试作业:

  queue.create(..)。attempts(5).save(); 

放在一起

由于priority(),trys()和save()方法都是可链接的,因此我们可以将它们像这样组合在一起:

  queue.create('email',{ 
标题:“欢迎使用该网站”
,发送至:“ user@example.com”
,模板:“ welcome-email”
})。priority('high')。attempts(5).save();

与工人一起工作

要运行已添加到队列中的作业,通常将创建一个单独的工作进程。 这应该像以前一样创建一个队列实例,并调用process()方法。 第一个参数应该是作业的名称,第二个参数应该是函数,该函数提供作业本身和回调作为参数。 例如:

  var queue = kue.createQueue(); 
  queue.process('email',function(job,done){ 
sendEmail(job.data,完成);
});

您将从上面的示例中注意到,将作业添加到队列时提供的数据可通过作业对象上的data属性获得。

在Node.js应用程序中很常见,应该使用Error作为第一个参数来调用done回调,以指示失败,否则返回null。 如果您需要提供作业的结果(例如状态码或数据库条目的ID),则可以将其作为完全可选的第二个参数提供。

其他注意事项

创建工作人员时,可能需要考虑几件事。

要跨多个进程运行,您可能希望考虑使用群集。

就像您可能已经猜到的那样,重要的是,工作者必须始终保持运行状态。 为此,您可能希望永久考虑或PM2。 您可能还会发现超级用户对于即使在系统重新启动后也可以确保进程持续运行很有用。

监控工作

除了提供一种用于创建和处理作业的方法外,Kue还提供了许多监视作业的功能。

UI

Kue提供了一个非常简单的可选用户界面,用于作为Express应用程序监视作业。

您可以从命令行将其作为独立应用程序运行:

  node_modules / kue / bin / kue-dashboard -p 3050 -r redis://127.0.0.1:3000 

或通过您自己的Express应用程序:

  kue.app.listen(3000); 

另外,Kue UI包提供了更流畅,更全面的UI。 您可以在下面的屏幕截图中看到它的操作:

JSON API

为了更加灵活地监视作业,Kue还提供了JSON API。

摘要

作业是增加容错能力,解耦应用程序体系结构以及在后台执行长时间运行的进程的好方法。 Kue不仅为此提供了Redis队列的高级抽象,还提供了一套监视所有作业状态的工具。 您可以在项目页面和文档中找到更多信息。