es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El procesador de Bull en NestJS nunca manejó trabajos en cola.

Estoy intentando enviar DTOs a mi cola de Redis con el framework Bull y manejar estos DTOs en procesadores. A veces el trabajo pasa al procesador (1 de 100), pero la mayoría de las veces falla con el error: el trabajo se detuvo más tiempo del límite permitido y no tengo idea de cómo solucionarlo.

Te doy una pequeña introducción y a continuación puedes ver mi código. He creado el módulo queue-api que sirve como envoltorio para mis colas, por ejemplo, la cola de orden. Luego importo este módulo en los módulos desde los cuales quiero publicar DTO en las colas, en mi caso el order-module.

Archivos del módulo queue-api

// queue-api.module.ts
@Module({
  imports: [
    BullModule.registerQueue(
      {
        name: 'order-queue',
        defaultJobOptions: {
          backoff: 10000,
          attempts: Number.MAX_SAFE_INTEGER,
        },
      },
    ),
    ...
  ],
  providers: [OrderQueue],
  exports: [OrderQueue],
})
export class QueueApiModule {}

// order-queue.ts
@Injectable()
export class OrderQueue extends AbstractQueue {
  constructor(
    @InjectQueue('order-queue')
    private readonly queue: Queue,
  ) {}

  async sendSubmitMail(dto: SendSubmitMailDto): Promise<void> {
    const job = await this.queue.add('send-submit-mail', dto)
    console.log(`Trabajo ${job.id} creado.`)
  }
}

Archivos del módulo order-module

// order.module.ts
@Module({
  imports: [
    QueueApiModule,
    ...
  ],
  providers: [
    OrderProcessor,
    ...
  ]
})
export class OrderModule {}

// order-processor.ts
@Processor('order-queue')
export class OrderProcessor {
  constructor(private readonly queue: OrderQueue) {}

  @Process('send-submit-mail')
  async onProcessSubmitMail(job: Job): Promise<void> {
    console.log(`Procesando el trabajo ${job.id}`)
  }
}

Este manejador de procesadores casi nunca se llama.

¿Tienes alguna idea de qué está mal en mi código? Gracias de antemano.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error “job stalled more than allowable limit” indica que el marco de trabajo Bull ha detectado que un trabajo ha quedado bloqueado durante más tiempo del límite permitido, y por lo tanto marca el trabajo como bloqueado. De forma predeterminada, el límite permitido está establecido en 1 minuto.

    Hay algunas posibles causas para este problema:

    1. El trabajo lleva demasiado tiempo en completarse. Es posible que necesite optimizar la lógica de procesamiento del trabajo para que sea más rápido y eficiente.
    2. El trabajo no está siendo reconocido o completado correctamente. Asegúrese de que su procesador de trabajos esté reconociendo los trabajos completados utilizando el método “done”, y maneje cualquier error que pueda ocurrir en la lógica de procesamiento del trabajo.

    3. El trabajo está siendo interrumpido o cancelado mientras se está procesando. Asegúrese de que su lógica de procesamiento de trabajos pueda manejar interrupciones o cancelaciones de manera adecuada, y vuelva a intentar cualquier trabajo fallido según sea necesario.

    Aquí hay algunas sugerencias para solucionar este problema:

    1. Revise los registros en busca de cualquier mensaje de error o rastreo de la pila que pueda proporcionar más información sobre lo que está causando que los trabajos se bloqueen.

    2. Intente aumentar el límite permitido para el bloqueo para ver si eso resuelve el problema. Puede hacer esto estableciendo la propiedad “settings.stallInterval” al registrar su cola con el marco de trabajo Bull.

    3. Considere utilizar la biblioteca BullMQ en lugar de Bull, ya que ofrece funciones más avanzadas para monitorear y administrar colas de trabajos, incluido el soporte incorporado para la reintentación automática de trabajos bloqueados.

    4. Si ninguna de las sugerencias anteriores funciona, considere comunicarse con la comunidad Bull o el equipo de soporte para obtener ayuda. Podrían proporcionar orientación más específica en función de su caso de uso y entorno.

Comments are closed.