CRON + Nodejs +多核=>行为?

Mar*_*ruf 6 cron multithreading node.js

我正在将CRON样模块构建到我的服务中(使用node-schedule),该模块将在我的多核设置的每个实例中都需要使用,我想知道它们都在运行自己的线程,并且都计划运行到同时运行,因为每个线程都加载相同的模块,所以它们会被每个线程调用一次还是被调用一次。

如果确实多次调用它们,那么确保所需动作仅被调用一次的最佳方法是什么?

小智 5

如果您在集群模式下 使用pm2 ,则可以使用process.env.NODE_APP_INSTANCE来检测哪个实例正在运行。您可以使用以下代码,这样您的 cron 作业将仅被调用一次。

// run cron jobs only for first instance
if(process.env.NODE_APP_INSTANCE === '0'){
    // cron jobs
}
Run Code Online (Sandbox Code Playgroud)


Kc *_*son 0

以通用方式处理此问题的最佳方法是拥有一个向其写入“锁定”条目的共享数据库。假设所有任务都写入了一个数据库条目,例如{instanceId: "a", taskId: "myTask", timestamp: "2021-12-22:10:35"}.

所有任务都会提交相同的内容,除了它们自己的实例 ID。然后,您在“时间戳”上有一个唯一的索引,因此只有 1 被接受。

然后他们都进行查询,看看他们的节点是否被接受执行 cron。

您可以做同样的事情,但也可以添加一个“随机”字段来生成随机数,并且数字最小的任务获胜。