仅运行一个节点任务实例

时间:2018-12-14 20:35:48

标签: node.js express cron

说明: 我有一个节点模块,可以解析外部监视页面并将每日数据推送到数据库。此任务大约需要10分钟,并计划每天通过node-cron运行一次。我还有一个页面,您可以在其中手动输入额外的参数(例如id或date)来手动启动此任务。这是通过快速路由访问的(让我们说app.post('/manual-task', runTask))。 Cron工作和HTTP路由是Express Restfull API应用的一部分。

问题: 我只需要这个模块的一个运行实例(实际上是类模块),例如有人在页面上启动了此任务,但是已经有正在运行的cron作业了。它应该警告用户作业已经在进行中。我有一些想法,但我想避免不良做法:

  • pid?
  • 环境变量?
  • 将作业作为对api的请求而不是直接执行?
  • 如果我在快速路线中运行子进程,应该使用子进程吗?

最佳方法和实践方法是什么?

谢谢

1 个答案:

答案 0 :(得分:2)

听起来您需要一种持久的方式来使您的流程的多个实例共享状态。如果可能的话,最好的方法是与系统无关(即,不在运行的计算机上运行某些内容,例如pid或env变量),以便您的解决方案可以扩展到多台计算机,以便与cron作业分开部署API。

有几种方法取决于您的需求,但它们都围绕您的过程进行:

  • 在第一次启动时进行检查,以查看是否有另一个进程 运行。
    • 如果有,可能会退出?逻辑取决于您。
    • 否则,当前进程需要记录它已经开始。
  • 进行解析。
  • 记录它在完成解析后已停止。

执行此操作的最佳方法是使每个进程在启动时都获得一个Lock,也许使用Redis as a lock。甚至还有library for node

如果您不太担心Race Condition,则不必实现锁定系统。我仍然建议在进程运行时存储类似Redis的内容,但是您也可以只写文件或类似内容。