AULA 65 MÓDULO 9 tópicos avançados ⏱ 55 min

Cache, Rate Limit e Filas

Cache Redis com TTL. Rate limiting contra brute force. BullMQ para jobs em background com retry exponencial.

RediscacheTTLrate limitBullMQfilasretry

Cache com Redis

Cache armazena resultados de operações custosas para servir respostas instantâneas em requisições futuras. Redis é o cache mais usado por ser in-memory e extremamente rápido.

🎯
quando cachear
Dados que mudam raramente (configurações, catálogo de produtos). Resultados de queries caras (relatórios). Não cache dados que precisam ser sempre frescos (saldo bancário, estoque em tempo real).

Rate Limiting

Rate limiting controla quantas requisições um cliente pode fazer em um período. Proteção essencial contra abuso, brute force e ataques DoS.

⚖️
rate limit por tier
APIs públicas: 100 req/h gratuito, 10.000 req/h premium. Endpoints de login: 5 tentativas por minuto por IP (prevenção brute force).

BullMQ — filas de trabalho

BullMQ é a biblioteca de filas mais robusta do ecossistema Node.js. Construída sobre Redis, oferece retry automático, prioridade, jobs agendados e workers concorrentes.

🏗️
padrão produtor-consumidor
API adiciona job à fila e responde ao cliente imediatamente. Worker processa em background. Cliente não espera o processamento — API escala independentemente dos workers.
javascript
// Redis cache + BullMQ juntos
const Redis  = require('ioredis')
const { Queue, Worker } = require('bullmq')
const redis  = new Redis()

// Cache — GET /products com TTL 5 minutos
app.get('/products', async (req, res) => {
  const cached = await redis.get('products:all')
  if (cached) return res.json(JSON.parse(cached))

  const products = await db.findAll()
  await redis.setex('products:all', 300, JSON.stringify(products))
  res.json(products)
})

// Rate limiting — express-rate-limit
const { rateLimit } = require('express-rate-limit')
app.use('/auth/login', rateLimit({
  windowMs: 60_000,  // 1 minuto
  max: 5,            // 5 tentativas
  message: { error: 'Muitas tentativas. Aguarde 1 minuto.' }
}))

// BullMQ — job de email em background
const emailQueue = new Queue('email', { connection: redis })

async function onOrderCreated(order) {
  await emailQueue.add('welcome', { to: order.email, orderId: order.id },
    { attempts: 3, backoff: { type: 'exponential', delay: 1000 } })
}
quiz · aula 65
Teste seus conhecimentos
0/3 respondidas
QUESTÃO 01
Qual o risco de cachear dados por muito tempo?
QUESTÃO 02
Por que aplicar rate limit especialmente no endpoint de login?
QUESTÃO 03
Por que usar BullMQ para envio de email em vez de enviar direto no handler?
0/3