NodeJ在多个节点上调度作业

时间:2016-01-18 14:44:52

标签: node.js scheduled-tasks scheduler

我在Load Balancer后面运行了两个nodeJs服务器。我有一些预定的作业,我想以分布式方式在这两个实例中的任何一个上运行一次。

我应该使用哪个模块? node-quartz(https://www.npmjs.com/package/node-quartz)对此有用吗?

5 个答案:

答案 0 :(得分:0)

我以前没有这样做,但我可以看到自己这样做。

  • 为Node.js使用任何调度程序库。

  • 为了达到目标,我会使用redis进行分布式锁定。在运行任何预定作业之前,工作人员/节点必须获得锁定;做好工作;完成工作时(或出错时)释放/ ack()。

答案 1 :(得分:0)

添加redis并使用node-redlock对于我需要在负载均衡器后面有三个Node.js进程的单个服务器上每天安排一次的小缓存作业来说似乎有点过分。

我发现了http://kvz.io/blog/2012/12/31/lock-your-cronjobs/ - 这让我想到了Tim Kay solo背后的概念。

概念是这样的 - 不是锁定对象(仅在单个进程中工作)或使用分布式锁(多个服务器需要),"锁定"通过侦听端口。服务器上的所有进程共享相同的端口。如果进程失败,它(当然)将释放端口。

请注意,在catch中发生硬故障(无法捕获任何内容)或释放锁定都是正常的,但忽略在捕获关键部分周围的异常时释放锁定意味着预定作业永远不会执行,直到锁定过程因其他原因而被回收。

当我尝试实施此操作时,我会更新。

修改

这是我锁定端口的工作示例:

multiProc.js

var net = require('net');
var server = net.createServer();

server.on('error', function () { console.log('I am process number two!'); });

server.listen({ port: 3000 },
    function () { console.log('I am process number one!');
                  setTimeout(function () {server.close()}, 3000); });

如果我在3秒内运行两次,这里是第一个和第二个实例的输出

第一

  

我是第一个流程!

第二

  

我是第二个流程!

另一方面,如果在执行两个实例之间超过3秒,则两者都声称是第一个进程。

答案 2 :(得分:0)

通过使用Zoologist软件包在可用实例之间进行选举,可以选择单个服务器作为领导者

https://www.npmjs.com/package/zoologist

需要Zookeeper服务器进行选举

答案 3 :(得分:0)

我不知道这是否对您有帮助,但仍在此处发布。

通常,node-schedule用于基于时间的计划,您只需执行一次任意代码即可。例如:下个月6:00 PM读/写数据库。

答案 4 :(得分:-2)

以下文章将解释如何根据我们对特定时间/日期实例的要求编写预定作业。

为了执行上述任务,我们将使用节点的CRON包。 要添加作业,我们需要:

1)安装Cron

npm install cron

2)要求cron的CronJob参与我们的项目。

var CronJob = require('cron').CronJob

3)创建一个CronJob实例

var jobs = new CronJob({
cronTime: ' * * * * * *',
 onTick: function () {
      //perform Your action
 },
 start: false,
 timeZone: 'Asia/Kolkata'
});

<强>参数

cronTime :它需要6个参数:

1)第二 - &gt; 0 - 59

2)分钟 - &gt; 0 - 59

3)小时 - &gt; 0 - 23

4)月份日 - &gt; 1 - 31

5)月 - &gt; 0 - 11

6)星期几 - &gt; 0 - 6

注意:我们可以在范围内定义cronTime,例如* for always。 每5分钟0 - 59/5。

onTick:要执行的操作。

开始:需要布尔值,如果为true,则立即启动作业。

timeZone:作业的时区

4)开始工作

jobs.start()

例如:

var jobs = new CronJob({
        cronTime: ' 00 00 0-23 * * *',
        onTick: function () {
            printMyName();
        },
        start: false,
        timeZone: 'Asia/Kolkata'
    });

   jobs.start();

 var printMyName = function () {
     var date = new Date();
    console.log("Hi Vipul  it is ", today);
 };

希望它有所帮助。