Filas de tarefas para TypeScript: visão geral de bibliotecas e implementação prática
Em aplicações web modernas em TypeScript, frequentemente surge a necessidade de executar operações que consomem muitos recursos de forma assíncrona, sem bloquear o fluxo principal. Para isso, são utilizadas filas de tarefas (job queues). Elas permitem adiar a execução, distribuir a carga e garantir o processamento confiável de processos em segundo plano. Neste artigo, veremos as melhores bibliotecas para trabalhar com filas em TypeScript, suas características e exemplos de uso.
Para que servem as filas de tarefas?
Imagine que sua aplicação precise enviar 1000 e-mails, processar imagens ou realizar cálculos complexos. Se isso for feito de forma síncrona, o usuário esperará minutos por uma resposta. A fila resolve esse problema: você coloca a tarefa em uma lista, e um worker a processa em segundo plano. Principais vantagens:
- Assincronia e processamento não bloqueante
- Escalabilidade (vários workers podem trabalhar em paralelo)
- Resiliência a falhas (a tarefa é reiniciada em caso de erro)
- Agendamento (as tarefas podem ser adiadas para um horário específico)
Principais bibliotecas para TypeScript
A maioria das soluções populares é construída sobre Redis — um banco de dados in-memory rápido, ideal para filas. Vamos considerar três opções principais:
1. Bull (a mais popular)
Bull é uma biblioteca madura e de alto desempenho para Node.js com suporte total a TypeScript. Ela oferece uma API rica e mecanismos integrados de repetição, atrasos e prioridades.
Instalação:
npm install bullnpm install @types/bullExemplo de criação de fila e manipulador:
import Queue from 'bull';
// Criamos uma fila para processar envios de e-mailconst emailQueue = new Queue('email', { redis: { host: 'localhost', port: 6379 }});
// Adicionamos uma tarefaasync function sendWelcomeEmail(userId: string) { await emailQueue.add({ userId });}
// Manipulador (worker)emailQueue.process(async (job) => { const { userId } = job.data; // Lógica de envio de e-mail aqui console.log(`Enviando e-mail para o usuário ${userId}`); await sendEmail(userId);});
// Tratamento de erros e novas tentativasemailQueue.on('failed', (job, err) => { console.error(`Tarefa ${job.id} falhou: ${err.message}`);});2. Bee-Queue (alternativa leve)
Bee-Queue é uma fila minimalista, também baseada em Redis. É mais simples que o Bull, mas mais rápida para cenários simples. É adequada quando não são necessárias configurações complexas.
Instalação:
npm install bee-queuenpm install @types/bee-queueExemplo:
import Queue from 'bee-queue';
const imageQueue = new Queue('images', { redis: { host: 'localhost', port: 6379 }});
// Adicionando uma tarefaimageQueue.createJob({ imagePath: '/uploads/photo.jpg' }).save();
// ProcessamentoimageQueue.process((job, done) => { const { imagePath } = job.data; // Processamento da imagem resizeImage(imagePath) .then(() => done()) .catch(done);});3. RSMQ (sem worker separado)
RSMQ (Redis Simple Message Queue) é uma fila puramente em Redis que não requer a execução de um processo worker separado. As tarefas são processadas através de um mecanismo pull. Ideal para arquitetura de microsserviços.
Instalação:
npm install rsmqExemplo:
import RedisSMQ from 'rsmq';
const rsmq = new RedisSMQ({ host: 'localhost', port: 6379 });
// Criamos uma filaawait rsmq.createQueueAsync({ qname: 'tasks' });
// Enviamos uma mensagemawait rsmq.sendMessageAsync({ qname: 'tasks', message: '{"type":"process_payment"}' });
// Recebemos e processamos (em loop)const message = await rsmq.receiveMessageAsync({ qname: 'tasks' });if (message.id) { console.log('Processando:', Também na biblioteca
SceneKit para Swift: Guia completo com exemplos práticos
FastEndpoints C# (.NET): guia completo com exemplos práticos
Trabalhando com Apache Kafka em Go (Golang): bibliotecas e exemplos
Testes em TypeScript: Guia Completo sobre Frameworks e Ferramentas
node-cache: Cacheamento Simples e Eficiente em Node.js