(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Como fazer deduplicação em Real-Time Analytics: passo a passo

João Barros 05 de August de 2026 4 min de leitura

Este tutorial mostra como implementar deduplicação de eventos em Real-Time Analytics para evitar contagens duplicadas quando múltiplos eventos idênticos chegam num curto espaço de tempo. A deduplicação é útil para métricas correctas, billing e integridade de dados em pipelines de streaming.

Pré-requisitos

  • Conta e acesso a uma plataforma de streaming que permita operações por janela/estado (ex.: Azure Stream Analytics, Apache Flink, Kafka Streams).
  • Fluxo de eventos com um identificador único por entidade (ex.: event_id, user_id) e timestamp.
  • Editor/terminal para testar queries/código e ver logs.

Passo 1: compreender o problema e a estratégia

Porque é que devemos deduplicar? Em Real-Time Analytics, eventos duplicados surgem por reenvios, falhas de rede ou entrega com at-least-once. A estratégia comum é usar uma janela temporal + armazenamento de estado que registe os event_id já processados durante essa janela. Vamos implementar uma deduplicação “por janela de tempo” que aceita o primeiro evento por event_id dentro de X minutos.

Passo 2: definir o formato mínimo do evento

Começa por garantir que cada evento tem: event_id (string), timestamp (ISO) e payload. Exemplo JSON para testes locais:

{
  "event_id": "abc-123",
  "timestamp": "2026-08-05T12:34:56Z",
  "user_id": "u42",
  "action": "click"
}

Passo 3: implementar deduplicação simples com SQL em streaming

Se estiveres a usar uma engine que suporte SQL sobre streaming (Azure Stream Analytics, Flink SQL), usa uma cláusula de janela e uma função de agregação para escolher o primeiro timestamp por event_id. Exemplo conceptual (ajusta para a tua plataforma):

-- Janela tumbling de 5 minutos, mantém apenas o primeiro evento por event_id
SELECT
  event_id,
  System.Timestamp() AS window_end,
  MIN(timestamp) as first_timestamp,
  ANY_VALUE(action) as action
FROM InputStream
GROUP BY
  TumblingWindow(minute, 5),
  event_id

Explicação: agrupa por event_id dentro de janelas de 5 minutos; MIN(timestamp) determina o primeiro evento. ANY_VALUE(action) é um placeholder para devolver o payload associado.

Passo 4: deduplicação com estado (exemplo em pseudo-code estilo Flink)

Para cenários onde queres garantir deduplicação mais flexível (stateful), usa um state store com TTL. Exemplo em pseudo-code que ilustra a lógica:

// Para cada evento recebido
onEvent(event) {
  key = event.event_id
  now = event.timestamp
  if (!state.exists(key) || state.get(key) < now - dedupTTL) {
    // não visto dentro do TTL → processar e gravar marca
    process(event)
    state.put(key, now)
  } else {
    // evento duplicado dentro do TTL → ignorar
    drop(event)
  }
}

// state tem TTL configurado para dedupTTL (ex.: 5 minutos)

Explicação: o state guarda o último timestamp visto por event_id; se o evento for mais recente do que o TTL, é aceite e actualiza o estado, caso contrário é ignorado.

Passo 5: optimizar para memória e escala

Erros comuns: guardar todos os event_id sem expirar; usar TTL demasiado longo; não particionar por chave. Boas práticas: escolher um TTL adequado (ex.: 5–15 minutos), usar compressão/hash da chave quando houver grande cardinalidade, e particionar o stream por event_id para distribuir o estado.

Passo 6: gerir idempotência no downstream

Mesmo com deduplicação, considera a idempotência no sistema de destino (ex.: upserts por event_id). Se o destino suportar deduplicação nativa (ex.: índices únicos), combina ambas as abordagens para maior robustez.

Verificar o resultado

Testa com um pequeno lote de eventos onde alguns têm o mesmo event_id dentro da janela TTL: espera receber apenas o primeiro. Os logs de processamento devem mostrar 'process' para o primeiro e 'drop' para os duplicados. Verifica métricas: número de eventos ingeridos vs eventos processados. Se usares uma engine SQL, executa queries sobre a saída e confirma que cada event_id aparece no máximo uma vez por janela.

Conclusão

Implementaste deduplicação em Real-Time Analytics usando janelas e/ou estado com TTL — isto reduz falsas contagens e melhora a integridade de dados. Próximos passos: integrar com o teu sistema de mensagens (Kafka/Event Hubs), testar em carga e afinar o TTL. Dica: qual é o trade-off entre um TTL curto e a perda de eventos legítimos — que TTL faz sentido para o teu caso?