Lidando com tarefas assíncronas em Node.js
BullMQ
Alan Ferreira dos Santos
Trajetória
+10 anos atuando com tecnologia
Especialista em Desenvolvimento de Software na TOTVS - CX
Amante dos Eventos de Tecnologia
Docente Ensino Superior + Bootcamps
alanfsantos
woodyalan
O que é o BullMQ?
O BullMQ
Biblioteca de filas de mensagens, rápida e robusta
Redis é a sua base
Criado para o Node.js
Queues
São as filas, onde adicionamos os trabalhos a serem processados
const emailQueue = new Queue('Emails');
const imageQueue = new Queue('Images');
const syncDataQueue = new Queue('Sync Data');
Jobs
São os trabalhos produzidos para serem adicionados na fila
await queue.add('email', {
to: 'user@example.com',
subject: 'BullMQ Message'
})
const job = await queue.add(...);
console.log(job.name) // 'email'
console.log(job.data) // { input: '...', output: '...' }
console.log(job.id) // 8ed91589-f509-444d-b131-074d6473f3b8
Dados do Job
Remoção
const job = await queue.add('email', {
to: 'user@example.com',
subject: 'BullMQ Message'
})
await job.remove();
Pause
await queue.pause();
await queue.resume();
FIFO/LIFO
await queue.add('email', {
to: 'user@example.com',
subject: 'BullMQ Message'
}, { lifo: true })
Retardar Execução
const job = await queue.add('email', {
to: 'user@example.com',
subject: 'BullMQ Message'
}, { delay: 5000 })
await job.changeDelay(new Date('03-07-2035 10:30'));
Priorização
const job = await queue.add('email', {
to: 'user@example.com',
subject: 'BullMQ Message - Last'
}, { priority: 10 })
await queue.add('email', {
to: 'user@example.com',
subject: 'BullMQ Message - First'
}, { priority: 1 })
await job.changePriority({
lifo: true,
});
const jobs = await queue.getPrioritized();
Tentativas
await queue.add('email', {
to: 'user@example.com',
subject: 'BullMQ Message'
}, { attempts: 3 })
Ciclo de Vida
waiting
delayed
active
completed
failed
delayedRetry
paused
Workers
São instâncias que executam algum trabalho adicionado a fila com a missão de concluí-lo.
const worker = new Worker('Emails', async (job: Job) => {
// Do something with job
return 'some value';
});
Simultaneidade
const worker = new Worker(
'Emails',
async (job: Job) => {
// Do something with job
return 'some value';
},
{ concurrency: 10 },
);
Progresso
const worker = new Worker(
'Emails',
async (job: Job) => {
job.progress(0);
// first step
job.progress(50);
// last step
job.progress(100);
// Do something with job
return 'some value';
}
);
Tratamento de Erros
const worker = new Worker(
'Emails',
async (job: Job) => {
try {
// job logic
// Do something with job
return 'some value';
} catch(err) {
// Reject Promise on error
throw err
}
}
);
Monitoramento
Possui um pacote NPM que permite visualizar filas, trabalhos, falhas e novas tentativas, além de permitir pausar e retomar filas
@bull-board/ui
Eventos
waiting
active
stalled
completed
failed
paused
removed
resumed
progress
Eventos
job.on('completed', () => {
// Job completed
})
job.on('failed', (err) => {
// Job failed with error
})
Práticas recomendadas
- Lidar com os erros de forma adequada para que os trabalhos sejam repetidos;
- Monitore e alerte quando trabalhos falharem;
- Utilize variáveis de ambiente para gerenciar limites de simultaneidade, podendo equilibrar o desempenho e a carga;
- Faça testes de estresse antes de utilizar em produção.
Obrigado!
BullMQ
By Alan Ferreira dos Santos
BullMQ
Discover how BullMQ can enhance your Node.js applications by efficiently handling asynchronous tasks. Learn how to optimize your workflow and improve performance in just a few simple steps.
- 104