Así que desarrollé un sistema con Nest.js que puede crear un cronjob dinámico a partir de la entrada de un usuario en la aplicación frontend, almaceno estos datos en mi base de datos y al mismo tiempo creo el trabajo en el servidor con el módulo de programación dinámica API . Hoy me preguntaba qué pasaría con mis cronjobs si mi servidor se apagara o si se reiniciara solo, dado que mis trabajos no son declarativos y se crean en tiempo de ejecución, creo que tal vez cuando mi servidor se inicie, ¿debería crear los cronjobs nuevamente? No estoy seguro de si esto se almacena en la memoria o algo así, ya que no está en la documentación.
Mi preocupación, en pocas palabras, es:
¿Debo volver a crear mis trabajos usando la información de la base de datos una vez que el servidor se inicia solo? ¿Por qué sí o por qué no?
Una vez que el servidor se reinicie, deberá reiniciar sus tareas CRON.
La razón de esto es que su aplicación NestJS realmente no agrega expresiones CRON a un crontab en la máquina, sino que programa y ejecuta estas tareas en un ejecutor de tareas compatible con expresiones CRON (ejemplo de paquete: node-cron ) Una vez que el servidor se detiene, el programador (que se ejecuta en el mismo proceso) también se detiene.
Mencionó que ya almacena las tareas en una base de datos, por lo que debería poder obtener la información que necesita para recrear la tarea en el inicio del servidor.
Supongo que tiene un Service que maneja tareas CRON y tiene acceso a la base de datos. De lo contrario, puede crear uno dedicado
Puede modificarlo para implementar la interfaz OnModuleInit y ejecutar la lógica que leería todas las tareas existentes que deberían ejecutarse e iniciarlas:
@Injectable() class CronService implements OnModuleInit { constructor(private readonly cronRepository: CronRepository) {} /* ... CRON IMPLEMENTATION ... */ private async restartSavedCronTasks(): Promise<void> { // get date from DB and start all relevant tasks } async onModuleInit: Promise<void> { await this.restartSavedCronTasks(); } }La respuesta es sí, debe volver a crear los trabajos cron después de que se reinicie el servidor. Lo mejor es que una vez que el usuario crea el trabajo cron, lo almacenará en la base de datos o usará la base de datos que ya usa para Frontend.
En general, podría tener dos niveles de persistencia de estos datos en caso de necesidad.
escenario 1
Muy rara vez reinicia sus servidores. En este caso, almacene en algo persistente como un archivo json en un depósito s3 (no público) o en una base de datos sql o mongo si la tiene conectada.
Vuelva a crear los trabajos cron "no controlados" o relevantes en el calentamiento del servidor.
Escenario 2
A menudo reinicia sus servidores/servicios. En este caso, tal vez almacene en una base de datos en memoria como Redis, así como en un tipo más persistente (en caso de que su base de datos Redis se caiga y necesite volver a llenarla, siempre que estos datos sean importantes).
Vuelva a crear los trabajos cron "no controlados" o relevantes en el calentamiento del servidor.
Almacenar en Redis en general en lugar de almacenar en memoria en una instancia de servidor específica también permitirá que su arquitectura general sea más escalable ya que un servidor diferente también puede leer desde Redis (la misma "fuente de la verdad")
Espero que esto te ayude a planificar tu arquitectura en consecuencia :)