Redis Pub/Sub vs Kafka

Redis vs Kafka: quando usar cada um

Comparação prática com código para sinais efêmeros e eventos duráveis.

Avançado 35 min 30 pontos Leitura 0%

Nesta aula você vai

  • Comparar Redis Pub/Sub e Kafka na prática
  • Mapear requisitos de replay, ordering e durabilidade
  • Implementar exemplos mínimos para cada tecnologia no monorepo

Redis vs Kafka: quando usar cada um

Objetivos

  • Entender diferença entre broadcast efêmero e stream durável.
  • Relacionar cada ferramenta com casos reais do e-commerce.
  • Evitar decisões baseadas apenas em latência.

Pré-requisitos

  • Docker com Redis e Kafka ativos.
  • Node.js para snippets utilitários.
  • Conhecimento básico de publicação/consumo de eventos.

Conceito

Use Kafka quando precisar de histórico, replay, retenção e consumo por grupo. Use Redis Pub/Sub para sinais rápidos que podem ser perdidos sem impacto crítico.

  • Exemplo Kafka: order.created, payment.approved (críticos).
  • Exemplo Redis Pub/Sub: alerta de dashboard interno, heartbeat, refresh de cache distribuído.

Estrutura de arquivos

docs/architecture/
└── messaging-decision-record.md
services/analytics-service/src/experiments/
├── kafka-producer.js
├── kafka-consumer.js
├── redis-publisher.js
└── redis-subscriber.js

Passo a passo

  1. Producer Kafka (services/analytics-service/src/experiments/kafka-producer.js):
import { Kafka } from "kafkajs";

const kafka = new Kafka({ clientId: "lab-kafka-producer", brokers: ["localhost:9092"] });
const producer = kafka.producer();

await producer.connect();
await producer.send({
  topic: "order.events",
  messages: [
    {
      key: "order-1001",
      value: JSON.stringify({
        eventId: "evt-k-1001",
        type: "order.created",
        payload: { orderId: "order-1001", amountCents: 12000 },
      }),
    },
  ],
});
await producer.disconnect();
  1. Publisher Redis (services/analytics-service/src/experiments/redis-publisher.js):
import Redis from "ioredis";

const redis = new Redis("redis://localhost:6379");
await redis.publish(
  "notifications.live",
  JSON.stringify({
    eventId: "evt-r-9001",
    type: "notification.sent",
    payload: { channel: "email", customerId: "c-1" },
  }),
);
await redis.quit();
  1. Decisão documentada (docs/architecture/messaging-decision-record.md):
## Decisão
- Eventos de domínio de pedido e pagamento: Kafka.
- Sinais efêmeros operacionais de baixa criticidade: Redis Pub/Sub.

## Motivos
- Kafka fornece retenção, replay e isolamento por consumer group.
- Redis Pub/Sub entrega latência baixa com setup simples.

Como testar

docker compose up -d kafka redis
node services/analytics-service/src/experiments/kafka-producer.js
node services/analytics-service/src/experiments/redis-publisher.js

Valide consumidores:

docker compose logs -f analytics-service

Dicas de projeto

  • Defina uma tabela de decisão por requisito (durabilidade, replay, SLA).
  • Não substitua Kafka por Redis em fluxos financeiros.
  • Não use Kafka para tudo; simplicidade operacional importa.

Erros comuns

  • Tratar Pub/Sub como fila persistente.
  • Ignorar custo operacional de cluster Kafka.
  • Misturar eventos críticos e efêmeros no mesmo desenho.

Resumo

Você comparou Redis Pub/Sub e Kafka com código real e definiu critérios claros para escolher a tecnologia certa em cada integração do monorepo.