我想找到集群之间的中心点
I want to find central point between clusters
我有一个由 NestJs 构建的项目,我想每 24 小时更改一次我的一些数据,我决定为此使用 CronJob。但是当我 运行 我的 pm2 项目(在不同的集群上)时,CronJob 为每个集群工作一次,并且完全适用于集群计数(如果我有 8 个集群,它工作 8 次)。我怎样才能找到 pm2 没有将其分开并且我的代码只能工作一次的中心点?
您对问题的看法似乎是正确的 - 如果您 运行 许多同质进程,每个进程都执行相同的 cronjob,那么 cronjob 的结果显然会重复。
这个问题有几种解决方法。最明显的是将 cron 逻辑拆分到另一个 Node.js 进程中,这样在任何给定时刻只有 1 个 cron 进程 运行ning。然后可以使用多种技术来实现:
- 指定为“您 运行 cron 的位置”的主机,在管理员手动切换主机之前,不允许其他主机 运行 cron 进程。
- Kubernetes - 控制平面已经为您提供了仅 运行 给定进程的 1 个副本的方法。
- 领导者选举 - 一系列进程通过网络进行协调,通常会就谁将成为“Cron”进行多数票投票。
或者,如果您有一个中央数据库,例如 PostgreSQL,您可以将它用作同步点 - 您可以为每个 cron 调用插入一个新行,并让消费者(实际执行任务的进程)读取新行。如果找到新行,则应通过 FOR UPDATE
锁定它,以确保排他性。这是网络锁定的基本形式。可以使用主键来防止重复调用,例如基于日期 - 如果您知道您每天只会调用 1 次,则只能有一个 ID 为 2021-11-10
.
的条目
最后,在线查找现有的 cron 实现。一些“同步 cron”库已经存在,可以解决这个确切的问题,例如 https://github.com/percolatestudio/meteor-synced-cron - 您可以将其用作灵感,或作为搜索的起点。
我有一个由 NestJs 构建的项目,我想每 24 小时更改一次我的一些数据,我决定为此使用 CronJob。但是当我 运行 我的 pm2 项目(在不同的集群上)时,CronJob 为每个集群工作一次,并且完全适用于集群计数(如果我有 8 个集群,它工作 8 次)。我怎样才能找到 pm2 没有将其分开并且我的代码只能工作一次的中心点?
您对问题的看法似乎是正确的 - 如果您 运行 许多同质进程,每个进程都执行相同的 cronjob,那么 cronjob 的结果显然会重复。
这个问题有几种解决方法。最明显的是将 cron 逻辑拆分到另一个 Node.js 进程中,这样在任何给定时刻只有 1 个 cron 进程 运行ning。然后可以使用多种技术来实现:
- 指定为“您 运行 cron 的位置”的主机,在管理员手动切换主机之前,不允许其他主机 运行 cron 进程。
- Kubernetes - 控制平面已经为您提供了仅 运行 给定进程的 1 个副本的方法。
- 领导者选举 - 一系列进程通过网络进行协调,通常会就谁将成为“Cron”进行多数票投票。
或者,如果您有一个中央数据库,例如 PostgreSQL,您可以将它用作同步点 - 您可以为每个 cron 调用插入一个新行,并让消费者(实际执行任务的进程)读取新行。如果找到新行,则应通过 FOR UPDATE
锁定它,以确保排他性。这是网络锁定的基本形式。可以使用主键来防止重复调用,例如基于日期 - 如果您知道您每天只会调用 1 次,则只能有一个 ID 为 2021-11-10
.
最后,在线查找现有的 cron 实现。一些“同步 cron”库已经存在,可以解决这个确切的问题,例如 https://github.com/percolatestudio/meteor-synced-cron - 您可以将其用作灵感,或作为搜索的起点。