Skip to content

Background Jobs

Sistema de processamento assíncrono com BullMQ.

BullMQ + Redis

  • BullMQ: Job queue para Node.js
  • Redis: Storage backend
  • Workers: Processadores assíncronos

Filas Disponíveis

PROCESS_PDF

Processa PDFs uploadados.

Job Data:

typescript
{
  uploadedFileId: string;
  r2FileKey: string;
}

Processamento:

  1. Download do PDF
  2. Extração de páginas (pdftoppm)
  3. Conversão para WebP (Sharp)
  4. Upload para R2
  5. Criação de registros no banco

Retry: 3 tentativas (5s, 10s, 20s)

INDEX_DOCUMENT

Indexa documentos no Sonic.

Job Data:

typescript
{
  documentId: number;
  action: "index" | "remove";
}

Ações:

  • index: Adiciona/atualiza documento no índice
  • remove: Remove documento do índice

Retry: 3 tentativas (5s, 10s, 20s)

EXTRACT_DOCUMENT_CONTENT (Futuro)

Extração de texto de PDFs para indexação avançada.

Workers

Registro de Workers

typescript
// packages/api/src/queues/workers.ts
export function registerWorkers() {
  new Worker(QUEUE.PROCESS_PDF, processPdfWorker);
  new Worker(QUEUE.INDEX_DOCUMENT, indexDocumentWorker);
}

Event Handlers

typescript
worker.on("completed", (job) => {
  console.log(`Job ${job.id} completed`);
});

worker.on("failed", (job, error) => {
  console.error(`Job ${job.id} failed:`, error);
});

Monitoramento

BullMQ Dashboard

Interface web para monitorar filas (futuro).

Métricas

  • Jobs pendentes
  • Jobs processados
  • Taxa de sucesso
  • Tempo médio de processamento
  • Jobs com erro

Configuração

Redis

env
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=

Concorrência

typescript
new Worker(QUEUE.PROCESS_PDF, processPdfWorker, {
  concurrency: 2  // Processar 2 PDFs simultâneos
});

Escalabilidade

Workers Horizontais

Múltiplos workers podem processar a mesma fila:

bash
# Servidor 1
npm run worker

# Servidor 2
npm run worker

Priority Queues

typescript
await queue.add("job", data, {
  priority: 1  // Maior prioridade
});

Sistema de Gestão de Arquivos Digitais