Tengo un proyecto creado por NestJs y quiero cambiar algunos datos cada 24 horas, he decidido usar CronJob para eso. Pero cuando ejecuto mi proyecto por pm2 (en diferentes clústeres), CronJob funciona una vez para cada clúster y funciona totalmente para el conteo de clústeres (si tengo 8 clústeres, funciona 8 veces). ¿Cómo puedo encontrar el punto central que pm2 no separa eso y mis códigos funcionan solo una vez?
Su opinión sobre el problema parece ser correcta: si ejecuta muchos procesos homogéneos, cada uno ejecutando el mismo cronjob, entonces los resultados del cronjob obviamente se duplicarán.
Hay varias soluciones al problema. La más obvia es dividir la lógica cron en otro proceso de Node.js, de modo que solo haya 1 proceso cron ejecutándose en un momento dado. Esto se puede implementar usando una variedad de técnicas:
Alternativamente, si tiene una base de datos central como PostgreSQL, puede usarla como un punto de sincronización: puede insertar una nueva fila para cada invocación de cron y hacer que los consumidores (los procesos que realmente ejecutan tareas) lean nuevas filas. Si se encuentra una nueva fila, debe bloquearse a través de FOR UPDATE , lo que garantiza la exclusividad. Esta es una forma rudimentaria de bloqueo de red. Las invocaciones duplicadas se pueden evitar mediante una clave principal, por ejemplo, en función de la fecha: si sabe que solo tendrá 1 invocación por día, solo puede haber una entrada con el ID 2021-11-10 .
Finalmente, busque en línea las implementaciones de cron existentes. Ya existen algunas bibliotecas "cron sincronizadas" que abordan este problema exacto, como https://github.com/percolatestudio/meteor-synced-cron ; puede usar esto como inspiración o como punto de partida para su búsqueda. .