Agendador de Tarefas em Node.js: visão geral e exemplos de uso
No desenvolvimento backend moderno, surge frequentemente a necessidade de executar código em horários programados: enviar campanhas de e-mail, limpar cache, criar backups de bancos de dados ou atualizar dados agregados. No ecossistema Node.js, existem várias bibliotecas maduras para esses fins. Neste artigo, vamos analisar três abordagens principais para o agendamento de tarefas: cron clássico, agendamento flexível e filas de tarefas.
1. node-cron — cron clássico para JavaScript
node-cron é uma biblioteca minimalista que permite executar funções usando expressões cron padrão. É ideal para tarefas periódicas simples (a cada minuto, a cada hora, todos os dias às 3:00).
Instalação:
npm install node-cronExemplo de tarefa que é executada a cada minuto:
const cron = require('node-cron');
cron.schedule('* * * * *', () => { console.log('Tarefa executada a cada minuto');});Estrutura da expressão cron: segundo minuto hora dia_do_mês mês dia_da_semana (no node-cron, o segundo é opcional).
Exemplos de expressões:
'0 0 * * *'— todos os dias à meia-noite'*/5 * * * *'— a cada 5 minutos'0 9-18 * * 1-5'— a cada hora das 9 às 18 em dias úteis'30 3 * * 0'— todos os domingos às 3:30
A biblioteca suporta validação de expressões e iniciar/parar tarefas:
const task = cron.schedule('*/10 * * * *', () => { // tarefa a cada 10 minutos});
// Parar a tarefatask.stop();
// Retomartask.start();
// Verificar se a tarefa está ativaconsole.log(task.isStarted()); // true/falseQuando usar: para ações periódicas simples, onde não é necessário armazenar estado ou tratamento de erros.
2. node-schedule — agendamento flexível com suporte a regras recorrentes
node-schedule é uma alternativa mais poderosa que permite definir agendamentos não apenas via cron, mas também através de objetos JavaScript com indicação explícita de datas, dias da semana e horários.
Instalação:
npm install node-scheduleExemplo com expressão cron:
const schedule = require('node-schedule');
const job = schedule.scheduleJob('*/5 * * * *', () => { console.log('Executado a cada 5 minutos');});A principal vantagem é a possibilidade de definir o agendamento através de um objeto:
const job = schedule.scheduleJob({ hour: 14, minute: 30, dayOfWeek: [1, 3, 5] // segunda, quarta, sexta}, () => { console.log('14:30 em dias úteis');});Também é possível agendar uma tarefa única para uma data específica:
const date = new Date(2025, 11, 31, 23, 59, 0);
schedule.scheduleJob(date, () => { console.log('Ano Novo chegou!');});A biblioteca suporta cancelamento de tarefas e verificação do próximo horário de execução:
// Cancelar a tarefajob.cancel();
// Obter a próxima data de execuçãoconsole.log(job.nextInvocation()); // Date objectQuando usar: quando é necessário controle preciso do tempo, combinação de regras ou tarefas únicas.
3. Bull — filas de tarefas com agendamento e novas tentativas
Bull é um sistema completo de filas baseado em Redis, que inclui um poderoso agendador. O Bull permite não apenas atrasar tarefas, mas também gerenciar repetições, prioridades e execução paralela.
Instalação:
npm install bullExemplo básico de fila com tarefa atrasada:
const Queue = require('bull');
const emailQueue = new Queue('email', { redis: { host: 'localhost', port: 63