NestJS Cron

💡En esta documentación se explicará cómo funciona la integración de los cron jobs en las aplicaciones de Inlaze. Para esto es necesario tener instalado Redis, PostgreSQL y Redis Commander.

Resumen

Esta receta proporciona una guía paso a paso sobre cómo integrar y gestionar cron jobs en las aplicaciones de Inlaze utilizando NestJs y Bull. Se requiere la instalación de Redis, PostgreSQL y Redis Commander. Los cron jobs se registran en PostgreSQL para garantizar la persistencia de la información, complementando la volatilidad de Redis.

Descripción

Los cron jobs en NestJs Bull funcionan conectándose a Redis, donde almacenan la información necesaria para mandar ejecuciones a los workers y colas de la aplicación. Sin embargo, dado que Redis es más volátil, se utiliza PostgreSQL para guardar la información de manera persistente. Este enfoque permite modificar las propiedades de los cron jobs y sincronizarlas de nuevo con Redis cuando sea necesario.

Prerrequisitos

  • Redis instalado

  • PostgreSQL instalado

  • Redis Commander instalado

  • Conocimientos básicos de NestJs y Bull

Casos de Uso

  • Configurar cron jobs persistentes en una aplicación NestJs.

  • Sincronizar cron jobs almacenados en PostgreSQL con Redis.

  • Gestionar cron jobs de manera eficiente y segura.

Modelos

Los modelos utilizados en este sistema son:

Instrucciones Paso a Paso

1. Configuración de la Base de Datos

Asegúrate de tener Redis y PostgreSQL configurados y funcionando.

2. Instalar Dependencias

Instala las dependencias necesarias en tu proyecto NestJs:

pnpm install @nestjs/bull bull redis
pnpm install @nestjs/typeorm typeorm pg

3. Configurar el Módulo Bull

Configura el módulo Bull en tu aplicación NestJs:

import { BullModule } from '@nestjs/bull';

@Module({
  imports: [
    BullModule.forRoot({
      redis: {
        host: 'localhost',
        port: 6379,
      },
    }),
    // Otros módulos
  ],
})
export class AppModule {}

4. Configurar el Módulo TypeORM

Configura el módulo TypeORM para conectar con PostgreSQL:

import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'postgres',
      host: 'localhost',
      port: 5432,
      username: 'your_username',
      password: 'your_password',
      database: 'your_database',
      entities: [__dirname + '/../**/*.entity{.ts,.js}'],
      synchronize: true,
    }),
    // Otros módulos
  ],
})
export class AppModule {}

5. Crear las Entidades

Define las entidades para CronJob, CronJobSchedule y JobOptions:

import { Entity, Column, PrimaryGeneratedColumn, ManyToOne, JoinColumn } from 'typeorm';

@Entity()
export class CronJob {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column({ type: 'varchar' })
  name: string;

  @Column({ type: 'varchar' })
  key: string;

  // Otras columnas...

  @ManyToOne(() => CronJobSchedule)
  @JoinColumn({ name: 'schedule_id' })
  schedule: CronJobSchedule;

  @ManyToOne(() => JobOptions)
  @JoinColumn({ name: 'opts_id' })
  opts: JobOptions;
}

@Entity()
export class CronJobSchedule {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column({ type: 'varchar' })
  cron_expression: string;

  // Otras columnas...
}

@Entity()
export class JobOptions {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column({ type: 'jsonb' })
  repeat: any;

  // Otras columnas...
}

6. Implementar el Servicio de CronJob

Crea el servicio CronJobService para gestionar los cron jobs:

@Injectable()
export class CronJobService {
  // Constructor e inyecciones...

  public async addCronJob(data: AddCronJobDto): Promise<CronJob> {
    // Lógica para añadir un cron job
  }

  public async updateCronJob(id: string, data: UpdateCronJobDto): Promise<void> {
    // Lógica para actualizar un cron job
  }

  public async removeCronJob(id: string): Promise<void> {
    // Lógica para eliminar un cron job
  }

  public async syncJobs(): Promise<void> {
    // Lógica para sincronizar cron jobs con Redis
  }

  // Otros métodos...
}

Validación

  1. Verificar Conexiones: Asegúrate de que Redis y PostgreSQL estén correctamente conectados y configurados.

  2. Pruebas de Funcionalidad: Añade, actualiza y elimina cron jobs para comprobar que las operaciones funcionan correctamente.

  3. Sincronización: Verifica que la sincronización de cron jobs entre PostgreSQL y Redis funcione como se espera.

Solución de Problemas

  • Errores de Conexión: Verifica las configuraciones de conexión para Redis y PostgreSQL.

  • Sincronización Fallida: Asegúrate de que las configuraciones de cron jobs estén correctamente definidas y que no haya conflictos en los nombres o expresiones cron.

Preguntas Frecuentes

  • ¿Qué pasa si Redis se reinicia?

    • Los cron jobs se perderán en Redis, pero se pueden sincronizar nuevamente desde PostgreSQL utilizando el método de sincronización del servicio.

  • ¿Puedo usar otra base de datos en lugar de PostgreSQL?

    • Sí, puedes utilizar cualquier base de datos SQL o NoSQL según tus necesidades, ajustando la configuración y las entidades correspondientes.

Recursos Adicionales

Conclusión

Siguiendo esta receta, has configurado correctamente cron jobs en tu aplicación NestJs utilizando Bull y PostgreSQL. Este sistema asegura que los cron jobs sean persistentes y permite gestionar, actualizar y sincronizar cron jobs de manera eficiente. Con esta configuración, puedes mejorar la fiabilidad y la gestión de tareas programadas en tus aplicaciones de Inlaze.

Last updated