Filas de tarefas em Node.js: Bull, Bee-Queue, Kue e implementação em Redis

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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 bull


Exemplo 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-queue


Exemplo 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

Recommendations