如果在 pm2 的集群模式下在 2 cpu 核心服务器上使用 (
@nestjs/schedule
)[https://docs.nestjs.com/techniques/task-scheduling]。它同时启动2个相同的任务并导致数据库中的数据冲突。你怎么处理这个?
如果您引入一种协调机制,以便只有一个实例处理计划的作业,将会有所帮助。常见的解决方案是使用分布式锁(例如基于 Redis 的锁)或配置代码,以便任务仅在指定的“主”实例上运行。这可确保在多进程或集群设置(例如集群模式下的 pm2)上,只有一个进程执行任务,从而防止数据冲突。
当您在 pm2 的集群模式下使用 @nestjs/schedule 运行 NestJS 时,每个 CPU 核心都会生成一个单独的 Node.js 进程。如果没有协调,每个进程都会尝试同时运行计划任务,从而导致重复工作和数据冲突。
只有第一个获得锁的进程才会在启动计划任务之前使用分布式锁机制(例如基于 Redis 的锁)。所有其他进程都会跳过该运行。像 node-redlock 这样的库可以帮助轻松实现这一点。
或者,您可以检测当前进程是“主进程”还是“worker #0”,并仅在那里运行计划任务。例如,您可以仅在一个实例上设置环境变量,或者在启动调度程序之前检查 cluster.isMaster。只有主实例执行计划作业,而其他实例则避免执行。
另一种架构方法是运行一个专门负责调度任务的实例,而所有其他实例仅充当工作人员。这可确保任务永远不会重复。
这些模式在集群环境中很常见。