Idempotência e Deduplicação
Proteção completa nos consumers
Padronizando deduplicacao nos consumidores criticos com testes.
Nesta aula você vai
- Aplicar idempotencia ponta a ponta nos consumidores criticos
- Padronizar middleware reutilizavel de deduplicacao
- Validar comportamento com testes de repeticao em lote
Proteção completa nos consumers
Objetivos
- Aplicar idempotência ponta a ponta nos consumidores críticos
- Padronizar middleware ou utilitário de deduplicação
- Validar comportamento com testes de repetição em lote
Pré-requisitos
- Aulas 1 e 2 de
idempotencia-eventosconcluidas. - Deduplicacao persistida ja funcionando no
payment-service. - Ambiente com pelo menos 2 replicas de
payment-servicepara teste real.
Conceito
Idempotencia parcial gera lacunas: um servico descarta duplicata, outro repete efeitos colaterais. O objetivo agora e padronizar o comportamento em todos os consumidores sensiveis.
O padrao recomendado combina middleware + store transacional + metrica de duplicata descartada.
Estrutura de arquivos
shared/idempotency/handler.tsservices/payment-service/internal/consumers/order_created_consumer.goservices/notification-service/app/consumers/payment_approved_consumer.rbservices/analytics-service/src/consumers/notificationSentConsumer.ts
Passo a passo com codigo
- Criar contrato comum de deduplicacao em
shared:
export interface IdempotencyStore {
tryReserve(eventId: string, consumer: string): Promise<boolean>;
}
- Aplicar no Payment Service antes do processamento:
if ok, _ := store.TryReserve(ctx, tx, event.EventID, "payment.order-created"); !ok {
metrics.DuplicatesDiscarded.WithLabelValues("payment").Inc()
return nil
}
- Aplicar no Notification Service com mesmo padrao:
reserved = idempotency_store.try_reserve(event["eventId"], "notification.payment-approved")
return if !reserved
send_email(event["data"])
- Criar teste de repeticao em lote:
for i in {1..50}; do
kcat -b localhost:9092 -t payment.approved -P <<'EOF'
{"eventId":"evt-pay-77","eventType":"payment.approved","data":{"orderId":"ord-77"}}
EOF
done
Como testar
- Suba 2 replicas do Payment.
- Dispare eventos duplicados em lote (mesmo
eventId). - Verifique no banco que existe apenas um registro por evento.
- Consulte metricas
duplicates_discarded_total. - Confirme ausencia de efeitos duplicados (email e analytics).
Dicas
- Centralize comportamento no
shared/idempotency. - Exponha metrica de duplicata por servico e topico.
- Mantenha logs com
event_ideconsumer_name. - Teste corrida com replicas simultaneas.
Erros comuns
- Cobrir apenas
payment-service. - Usar chaves diferentes para o mesmo consumidor logico.
- Nao medir duplicatas descartadas.
- Misturar deduplicacao com regra de envio de email.
Resumo
Com uma camada padronizada de idempotencia, os consumers do stack de 5 microsservicos passam a tratar redelivery de forma previsivel, auditavel e segura em escala.