Introdução: Por que precisamos de filas de tarefas?
Imagine que você está executando um servidor web em Node.js. Um usuário envia uma solicitação para enviar 1000 e-mails. Se você processar essa solicitação de forma síncrona, o servidor "congelará" por vários minutos — todos os outros usuários não conseguirão obter uma resposta.
Como resolver esse problema? A resposta — filas de tarefas (task queues). Elas permitem adiar a execução de operações que consomem muitos recursos (envio de e-mails, geração de PDF, processamento de imagens) e executá-las em segundo plano, sem bloquear o fluxo principal da aplicação.
Neste artigo, abordaremos:
- O que é uma fila de tarefas e como ela funciona
- Bibliotecas populares para Node.js (Bull, Kue)
- Exemplos de código: criação, adição e processamento de tarefas
- Melhores práticas para iniciantes
1. Fundamentos de filas de tarefas em Node.js
O que é uma fila de tarefas?
Uma fila de tarefas é uma estrutura de dados que opera com base no princípio FIFO (First In, First Out — o primeiro a entrar é o primeiro a sair). As tarefas são adicionadas ao final da fila e processadas a partir do início. Normalmente, as filas são construídas sobre o Redis — um armazenamento rápido de chave-valor em memória.
Componentes principais de uma fila:
- Producer — código que adiciona tarefas à fila
- Consumer (Worker) — código que retira tarefas e as executa
- Queue Manager — mecanismo que gerencia a fila (geralmente Redis)
Bibliotecas populares
Para Node.js, existem duas bibliotecas principais:
- Bull — moderna, rápida, com suporte a prioridades, repetições e atrasos
- Kue — biblioteca antiga, mas simples (atualmente menos popular)
Neste artigo, focaremos no Bull, pois é ativamente mantido e possui mais recursos.
2. Instalação e configuração do Bull
Passo 1: Instalação do Redis
O Bull usa Redis. Se você não tiver o Redis, instale-o:
# macOSbrew install redis
# Ubuntusudo apt-get install redis-server
# Iniciar Redisredis-serverPasso 2: Instalação do Bull
Crie um novo projeto e instale o pacote:
mkdir queue-democd queue-demonpm init -ynpm install bullPasso 3: Configuração básica
Crie o arquivo queue.js:
const Queue = require('bull');
// Criando uma fila com o nome 'emailQueue'const emailQueue = new Queue('emailQueue', { redis: { host: '127.0.0.1', port: 6379 }});
module.exports = emailQueue;3. Exemplo: fila para envio de e-mail
Passo 1: Criando o Producer (adição de tarefas)
Crie o arquivo producer.js:
const emailQueue = require('./queue');
async function addEmailTask(to, subject, body) { // Adicionando uma tarefa à fila const job = await emailQueue.add({ to: to, subject: subject, body: body }, { // Opções da tarefa attempts: 3, // Número de tentativas em caso de erro backoff: 5000, // Atraso entre tentativas (5 seg) delay: 1000 // Atraso antes da execução (1 seg) });
console.log(`Tarefa adicionada com ID: ${job.id}`); return job;}
// Exemplo de usoaddEmailTask('user@example.com', 'Olá!', 'Mensagem de teste');Passo 2: Criando o Worker (processamento de tarefas)
Crie o arquivo worker.js:
const emailQueue = require('./queue');
// Função que simula o envio de e-mailasync function sendEmail(to, subject, body) { console.log(`Enviando e-mail para ${to}...`); // Simulação de atraso await new Promise(resolve => setTimeout(resolve, 2000)); console.log(`E-mail enviado: ${subject}`);}
// Manipulador da filaemai