Filas de Tarefas para TypeScript: guia completo sobre Bull e Bee-Queue
No desenvolvimento de aplicações web modernas em TypeScript, surge frequentemente a necessidade de executar operações longas ou que consomem muitos recursos de forma assíncrona, sem bloquear o fluxo principal. Por exemplo: envio de notificações por e-mail, geração de relatórios em PDF, processamento de imagens ou sincronização com APIs externas. Para resolver esses problemas, são utilizadas filas de tarefas (job queues). Neste artigo, vamos analisar detalhadamente as duas bibliotecas mais populares para TypeScript — Bull e Bee-Queue, além de explicar como integrá-las ao seu projeto.
Para que servem as filas de tarefas?
Uma fila de tarefas permite:
- Dividir responsabilidades — o serviço principal é responsável apenas por enfileirar a tarefa, e o processador, por executá-la.
- Gerenciar a carga — é possível limitar o número de tarefas paralelas (concurrency).
- Garantir a entrega — as tarefas não são perdidas mesmo em caso de falha do processo (graças ao Redis).
- Agendar a execução — adiar uma tarefa para um horário específico ou repeti-la em um cronograma.
- Tratar erros — tentativas automáticas de repetição (retry) com atraso exponencial.
Bull — a fila mais popular para Node.js e TypeScript
Bull é uma biblioteca poderosa baseada em Redis, que oferece um conjunto completo de funcionalidades: prioridades, tentativas de repetição, atrasos, pausas, eventos e monitoramento. Bull possui uma excelente tipagem para TypeScript.
Instalação e configuração
npm install bull @types/bullExemplo simples de uma fila para envio de e-mail:
import Queue from 'bull';
interface EmailJob { to: string; subject: string; body: string;}
// Criando uma fila com o nome 'email'const emailQueue = new Queue<EmailJob>('email', { redis: { host: 'localhost', port: 6379 }, defaultJobOptions: { attempts: 3, // até 3 tentativas backoff: { type: 'exponential', delay: 2000 }, removeOnComplete: true, }});
// Processador — executado em segundo planoemailQueue.process(async (job) => { console.log(`Enviando e-mail para ${job.data.to}`); // Simulação de envio await new Promise(resolve => setTimeout(resolve, 1000)); console.log(`E-mail enviado: ${job.data.subject}`);});
// Adicionando uma tarefaasync function addEmail() { await emailQueue.add({ to: 'user@example.com', subject: 'Olá da fila!', body: 'Esta é uma mensagem de teste.', });}
addEmail();Funcionalidades avançadas do Bull
- Tarefas repetitivas (cron):
queue.add(data, { repeat: { cron: '0 8 * * *' } }) - Prioridades:
queue.add(data, { priority: 1 })— quanto menor o número, maior a prioridade. - Atraso na execução:
queue.add(data, { delay: 60000 })— adiar por 1 minuto. - Eventos: é possível se inscrever em
completed,failed,progresse outros. - Pausar/retomar:
queue.pause()/queue.resume().
// Tratamento de eventosemailQueue.on('completed', (job, result) => { console.log(`Tarefa ${job.id} concluída`);});
emailQueue.on('failed', (job, err) => { console.error(`Tarefa ${job.id} falhou: ${err.message}`);});Bee-Queue — uma alternativa leve
Bee-Queue é uma fila minimalista baseada em Redis, mais simples e rápida que o Bull em termos de consumo de memória. É adequada para projetos pequenos ou casos em que não são necessárias configurações complexas.
Instalação e exemplo
npm install bee-queueimport Bee from 'bee