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:
- Download do PDF
- Extração de páginas (pdftoppm)
- Conversão para WebP (Sharp)
- Upload para R2
- 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 índiceremove: 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 workerPriority Queues
typescript
await queue.add("job", data, {
priority: 1 // Maior prioridade
});