O que é Bull e para que serve?
\n\nBull é uma biblioteca poderosa e popular para gerenciamento de filas de tarefas (job queues) no ambiente Node.js. Ela é construída sobre o Redis e oferece uma maneira confiável, escalável e flexível de processar tarefas em segundo plano. Se sua aplicação precisa executar operações que não devem bloquear o fluxo principal (por exemplo, envio de email, processamento de imagens, geração de PDF, sincronização com APIs externas, análise de dados), Bull é a solução ideal.
\n\nPor que usar Bull?
\n- \n
- Processamento assíncrono: Descarrega o servidor principal, movendo tarefas pesadas para um processo em segundo plano. \n
- Confiabilidade: As tarefas são armazenadas no Redis, portanto não são perdidas ao reiniciar a aplicação ou em caso de falha do worker. \n
- Tentativas repetidas: Suporte integrado para repetições automáticas em caso de erros. \n
- Agendamento: Possibilidade de adiar tarefas ou executá-las em horários programados (cron). \n
- Prioridades: Gerenciamento da ordem de execução das tarefas. \n
- Monitoramento: Acompanhe facilmente o estado das filas com a interface de usuário integrada (Bull Board). \n
Instalação do Bull
\n\nPara começar, certifique-se de que o Redis esteja instalado e em execução. Bull não funciona sem ele.
\n\n- \n
- Instalação do Redis (exemplo para Ubuntu/Debian):\n
\nsudo apt update\nsudo apt install redis-server\nsudo systemctl start redis\n - Instalação do Bull via npm:\n
\nnpm install bull\n - Instalação do Bull Board (opcional, para interface web):\n
\nnpm install @bull-board/express @bull-board/api\n
Início rápido: primeiro exemplo
\n\nVamos criar uma fila simples para enviar emails de boas-vindas.
\n\nPasso 1: Criando o produtor (producer.js)
\nconst Queue = require('bull');\n\n// Cria uma fila com o nome 'emailQueue'\nconst emailQueue = new Queue('emailQueue', {\n redis: { host: 'localhost', port: 6379 }\n});\n\n// Função para adicionar uma tarefa à fila\nasync function addEmailJob(to, subject, body) {\n const job = await emailQueue.add(\n { to, subject, body }, // Dados da tarefa\n {\n attempts: 3, // Número de tentativas em caso de erro\n backoff: { type: 'fixed', delay: 5000 } // Atraso entre tentativas (5 seg)\n }\n );\n console.log(`Tarefa adicionada com ID: ${job.id}`);\n return job;\n}\n\n// Exemplo de uso\naddEmailJob('user@example.com', 'Bem-vindo!', 'Obrigado por se registrar.')\n .then(() => process.exit(0))\n .catch(err => console.error(err));\n\n\nPasso 2: Criando o worker (worker.js)
\nconst Queue = require('bull');\n\n// Conecta-se à mesma fila\nconst emailQueue = new Queue('emailQueue', {\n redis: { host: 'localhost', port: 6379 }\n});\n\n// Manipulador de tarefas\nemailQueue.process(async (job) => {\n console.log(`Processando tarefa ${job.id}...`);\n const { to, subject, body } = job.data;\n\n // Simulação de envio de email (na prática, use nodemailer)\n await new Promise(resolve => setTimeout(resolve, 2000));\n console.log(`Email enviado para ${to}: ${subject}`);\n\n // Se algo der errado, lance um erro\n // throw new Error('Erro ao enviar');\n});\n\nconsole.log('Worker iniciado e aguardando tarefas...');\n\n\nPasso 3: Executando
\nPrimeiro, inicie o worker: node worker.js. Em seguida, em outro terminal, inicie o produtor: node producer.js. Você verá a tarefa entrar na fila e ser processada.
Principais métodos e funções do Bull
\n\n1. new Queue(name, [options]) — Criando uma fila
\nO que faz: Cria