说明:
我有一个节点模块,可以解析外部监视页面并将每日数据推送到数据库。此任务大约需要10分钟,并计划每天通过node-cron运行一次。我还有一个页面,您可以在其中手动输入额外的参数(例如id或date)来手动启动此任务。这是通过快速路由访问的(让我们说app.post('/manual-task', runTask)
)。 Cron工作和HTTP路由是Express Restfull API应用的一部分。
问题: 我只需要这个模块的一个运行实例(实际上是类模块),例如有人在页面上启动了此任务,但是已经有正在运行的cron作业了。它应该警告用户作业已经在进行中。我有一些想法,但我想避免不良做法:
最佳方法和实践方法是什么?
谢谢
答案 0 :(得分:2)
听起来您需要一种持久的方式来使您的流程的多个实例共享状态。如果可能的话,最好的方法是与系统无关(即,不在运行的计算机上运行某些内容,例如pid
或env变量),以便您的解决方案可以扩展到多台计算机,以便与cron作业分开部署API。
有几种方法取决于您的需求,但它们都围绕您的过程进行:
执行此操作的最佳方法是使每个进程在启动时都获得一个Lock
,也许使用Redis as a lock。甚至还有library for node。
如果您不太担心Race Condition,则不必实现锁定系统。我仍然建议在进程运行时存储类似Redis的内容,但是您也可以只写文件或类似内容。