Engenharia de Dados

Pipeline de Dados com Kafka para SaaS: Introdução Prática

Quando e como usar Kafka para construir pipelines de dados em tempo real no seu SaaS — com arquitetura, casos de uso reais e alternativas mais simples.

Everton Tubarao··5 min de leitura

Kafka não é para todo SaaS (e isso é bom)

Kafka é poderoso e Kafka é complexo. Para muitos SaaS, adicionar Kafka prematuramente é over-engineering que adiciona custo operacional sem benefício proporcional.

Este guia ajuda você a tomar a decisão certa: quando Kafka realmente faz sentido, o que ganhar com ele, e quando BullMQ ou SQS são escolhas melhores.


O que o Kafka faz que outros sistemas não fazem

Kafka é um log distribuído de eventos persistente. Os diferenciais importantes:

Replay de eventos

Eventos ficam no Kafka por um período configurável (padrão: 7 dias, mas pode ser semanas ou meses). Qualquer consumidor pode reprocessar eventos históricos do início ou de um ponto específico.

Caso de uso: você lança um novo serviço de analytics que precisa processar todos os eventos de pagamento dos últimos 30 dias. Com SQS ou BullMQ, os eventos sumiram. Com Kafka, você rebobina o offset e reprocessa.

Múltiplos consumidores independentes

Em SQS/BullMQ, um job é consumido por um worker e deletado. No Kafka, cada consumer group tem seu próprio offset — o mesmo evento pode ser processado por múltiplos serviços independentes.

Evento: "subscription.upgraded"
  → Consumer Group: billing-service     (atualiza plano no banco)
  → Consumer Group: notification-service (envia e-mail de confirmação)
  → Consumer Group: analytics-service   (atualiza métricas de MRR)

Com SQS, você teria 3 filas separadas e um "fan-out" manual. Com Kafka, os três serviços simplesmente assinam o mesmo tópico.

Ordem garantida por partition key

Kafka garante ordem dentro de uma partition. Se você usar tenant_id como partition key, todos os eventos de um tenant chegam ao consumidor em ordem — útil para event sourcing e auditoria.


Quando Kafka faz sentido no seu SaaS

Avalie Kafka quando você tem dois ou mais destes sinais:

  1. Múltiplos serviços precisam reagir aos mesmos eventos
  2. Volume alto: > 10.000 eventos por segundo consistentemente
  3. Replay de eventos é necessário (novo serviço precisa de histórico, recuperação de erro)
  4. Event sourcing: o estado do sistema é derivado de eventos imutáveis
  5. Analytics em tempo real: stream de eventos alimenta dashboards e alertas
  6. Auditoria: trilha de auditoria imutável é requisito de compliance

Se você tem apenas uma fila de jobs para processamento assíncrono simples, BullMQ + Redis (Node.js) ou SQS (AWS) são muito mais simples.


Arquitetura com Kafka em SaaS multi-tenant

Aplicação SaaS
  └→ Kafka Producer (publica eventos com tenant_id)
       └→ Tópicos por domínio:
            subscriptions    (criação, upgrade, downgrade, cancelamento)
            payments         (cobrança, estorno, falha)
            user-activity    (login, ação no produto, export)
            notifications    (requisição de envio de e-mail/push)

Consumers:
  └→ billing-worker      (consumer group: billing)
  └→ analytics-ingester  (consumer group: analytics → ClickHouse)
  └→ notification-sender (consumer group: notifications)
  └→ audit-logger        (consumer group: audit)

Convenções que economizam dor

Nomeação de tópicos: {domínio}.{entidade}.{evento} é mais escalável que nomes genéricos:

payments.subscription.created
payments.subscription.cancelled
users.account.deleted
billing.invoice.paid

Schema Registry: use Avro ou Protobuf com um Schema Registry (Confluent ou AWS Glue) para garantir compatibilidade de schema entre produtores e consumidores. Sem isso, uma mudança de schema quebra consumers sem aviso.

Dead Letter Queue (DLQ): configure um tópico DLQ para mensagens que falharam após N tentativas. Facilita investigação e reprocessamento seletivo.


Kafka vs. SQS vs. BullMQ: quando usar cada um

| Critério | BullMQ + Redis | Amazon SQS | Apache Kafka | |---|---|---|---| | Múltiplos consumers por evento | ✗ | ✗ (precisa SNS fan-out) | ✓ nativo | | Replay de eventos | ✗ | ✗ | ✓ | | Throughput | Médio (~10k/s) | Alto | Muito alto (> 1M/s) | | Latência | Baixa (<10ms) | Média (10–100ms) | Baixa (<10ms) | | Operação | Simples | Gerenciado pela AWS | Complexo (ou MSK) | | Custo inicial | US$ 10–30/mês (Redis) | Pay-per-message | US$ 200+/mês (MSK) | | Melhor para | Job queues simples, MVP | Desacoplamento de serviços | Event streaming, analytics |

Recomendação por fase

MVP e primeiros 12 meses: BullMQ + Redis. Simples, sem infra extra, cobre 95% dos casos.

Crescimento com múltiplos serviços: avalie SQS + SNS para fan-out simples. Gerenciado pela AWS, sem servidor para operar.

Escala ou evento sourcing: Kafka via MSK (Managed Streaming for Kafka da AWS) ou self-hosted com Kubernetes.


Implementação básica: produtor em TypeScript

import { Kafka } from 'kafkajs'

const kafka = new Kafka({
  clientId: 'saas-app',
  brokers: [process.env.KAFKA_BROKER!],
  ssl: true,
  sasl: {
    mechanism: 'plain',
    username: process.env.KAFKA_USERNAME!,
    password: process.env.KAFKA_PASSWORD!,
  },
})

const producer = kafka.producer()

export async function publishEvent<T>(topic: string, event: {
  tenantId: string
  type: string
  payload: T
}) {
  await producer.send({
    topic,
    messages: [{
      key: event.tenantId,          // partition key: mesmo tenant → mesma partition
      value: JSON.stringify(event),
      headers: {
        'event-type': event.type,
        'published-at': new Date().toISOString(),
      },
    }],
  })
}

// Uso:
await publishEvent('payments.subscription', {
  tenantId: 'acme',
  type: 'subscription.upgraded',
  payload: { planId: 'pro', previousPlanId: 'starter', userId: '...' },
})

Armadilhas comuns

Não ignore idempotência: networks falham, producers fazem retry, eventos duplicados chegam. Seu consumer deve tratar o mesmo evento duas vezes sem efeito colateral. Use o event.id como chave de deduplicação no banco.

Não use um tópico para tudo: um tópico genérico events com todos os tipos de evento misturados dificulta o controle de retenção, Schema Registry e permissões por serviço.

Não negligencie monitoring: monitore lag dos consumer groups — o número de mensagens não processadas. Um consumer parado acumula lag silenciosamente até o offset ultrapassar a retenção e perder eventos.


Para discussões de arquitetura sobre quando e como implementar Kafka (ou uma alternativa mais simples) no seu SaaS:

Falar com especialista em engenharia de dados → · Engenharia de dados para SaaS → · Stack tecnológica SaaS 2025 →

Precisa de ajuda com engenharia de dados?

A Codevops transforma ideias em produtos reais. Cuidamos de toda a parte técnica para que você foque no seu negócio. Respondemos em até 12 horas.

Falar com especialista →