CRON + Nodejs + 多核 => 行为?

CRON + Nodejs + multiple cores => behaviour?

我正在将类似 CRON 的模块构建到我的服务中(使用 node-schedule),我的多核设置的每个实例都需要它,我想知道因为它们都是 运行他们自己的线程,他们都被安排在同一时间运行,他们会被调用每个线程还是只调用一次,因为他们都在加载同一个模块。

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

node-schedule 运行s 在给定的节点进程中,它会安排特定节点进程要求它安排的事情。

如果您运行正在使用多个节点进程并且每个进程都在使用节点调度,那么这些单独节点进程中的所有节点调度实例都是独立的(它们之间没有合作或协调)。如果每个节点进程都要求它自己的节点调度实例 运行 在每个月的第一个星期三下午 3 点执行特定任务,那么所有节点进程都将在那个时候开始 运行 执行该任务。

如果您只想执行一次操作,那么您必须在节点实例之间进行协调,以便仅在一个节点进程中安排操作,而不是在所有节点进程中安排操作,或者仅将这些类型的操作安排在您的节点实例之一,而不是全部。

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

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

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

所有任务都会提交相同的东西,除了它们自己的 instanceId。然后,您在 'timestamp' 上有一个唯一索引,因此只有 1 个被接受。

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

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