Filas de tarefas para JavaScript (Node.js): Bull, Bee-Queue e Kue
Ao desenvolver aplicações web em Node.js, surge frequentemente a necessidade de executar operações que consomem muitos recursos ou são demoradas fora do fluxo principal de processamento de requisições HTTP. Envio de campanhas de e-mail, geração de relatórios em PDF, processamento de imagens carregadas ou interação com APIs externas — todas essas tarefas podem bloquear a resposta ao usuário se forem executadas de forma síncrona. Para resolver esse problema, são usadas filas de tarefas (job queues).
Uma fila de tarefas é um mecanismo que permite:
- Adiar a execução do trabalho para segundo plano.
- Gerenciar prioridades e a ordem de processamento.
- Repetir tarefas automaticamente em caso de erros.
- Escalar o processamento horizontalmente (vários workers).
No ecossistema Node.js, três bibliotecas ganharam grande popularidade: Bull, Bee-Queue e Kue. Todas são construídas sobre o Redis, o que garante alta performance e resiliência a falhas. Vamos analisar cada uma delas em detalhes.
1. Bull — a fila mais popular e funcional
Bull (npm: bull) é uma biblioteca madura e bem documentada que suporta praticamente todos os cenários necessários: tarefas adiadas, repetição agendada, prioridades, limites de taxa, pilhas de erros e até mesmo uma interface visual (Arete). O Bull é ativamente mantido pela comunidade e é recomendado para projetos em produção.
Instalação:
npm install bullExemplo simples — criando uma fila e um manipulador:
const Queue = require('bull');
// Criamos uma fila com o nome 'email'const emailQueue = new Queue('email', { redis: { host: 'localhost', port: 6379 }});
// Adicionamos uma tarefa (job)emailQueue.add({ to: 'user@example.com', subject: 'Bem-vindo!', body: 'Obrigado por se registrar.'}, { attempts: 3, // tentativas em caso de erro backoff: 5000, // atraso entre tentativas (5 seg) delay: 10000 // adiar por 10 segundos});
// Manipulador (worker)emailQueue.process(async (job) => { const { to, subject, body } = job.data; console.log(`Enviando e-mail para ${to}: ${subject}`); // Aqui, chame sua função de envio de e-mail await sendEmail(to, subject, body);});Principais recursos do Bull:
- Novas tentativas — configuração do número de retentativas e atraso exponencial.
- Agendamento (cron) — execução de tarefas em horários programados (por exemplo, todas as noites).
- Prioridades — tarefas com alta prioridade são processadas primeiro.
- Eventos — inscrição em eventos (completed, failed, progress).
- Graceful shutdown — encerramento correto da aplicação.
2. Bee-Queue — fila leve e rápida
Bee-Queue (npm: bee-queue) é uma alternativa minimalista ao Bull. Ela oferece apenas funcionalidades básicas, mas faz isso com sobrecarga mínima. O Bee-Queue é ideal para cenários simples, onde não são necessárias configurações complexas, mas a velocidade é importante.
Instalação:
npm install bee-queueExemplo de uso:
const Queue = require('bee-queue');
const imageQueue = new Queue('image-processing', { redis: { host: '127.0.0.1', port: 6379 }, isWorker: true});
// Adicionamos uma tarefaimageQueue.createJob({ imageId: 123, size: 'thumbnail' }) .timeout(30000) // timeout de 30 seg .retries(2) // 2 tentativas .save() .then(job => console.log('Job criado:', job.id));
// ManipuladorimageQueue.process((job, done) => { console.log(`Processando imagem ${job.data.imageId}`); // Executamos o trabalho proce Também na biblioteca
Geração de PDF em Kotlin: visão geral de bibliotecas e ferramentas
Filas de Tarefas em Go (Golang): Melhores Bibliotecas e Ferramentas
Eigen para C++: guia completo com exemplos