Quando uma chamada de API falha por timeout ou erro temporário, o padrão é tentar de novo — mas sem cuidado, isso pode gerar dados duplicados se a primeira tentativa parcialmente já tiver sido processada.

O que é idempotência na prática

Uma operação idempotente pode ser executada várias vezes com o mesmo resultado final — rodar duas vezes não deve duplicar nada.

Aplicando isso à coleta de dados do Instagram

def salvar_metrica_diaria(username, data, seguidores):
    # upsert em vez de insert puro -- roda quantas vezes for preciso
    db.execute("""
        INSERT INTO metricas (username, data, seguidores)
        VALUES (%s, %s, %s)
        ON CONFLICT (username, data) DO UPDATE SET seguidores = EXCLUDED.seguidores
    """, (username, data, seguidores))

Backoff exponencial em retries

import time

def buscar_com_retry(url, tentativas=3):
    for i in range(tentativas):
        try:
            return requests.get(url, timeout=10)
        except requests.RequestException:
            if i == tentativas - 1:
                raise
            time.sleep(2 ** i)  # 1s, 2s, 4s

Combinar upsert (idempotência no destino) com backoff (espaçamento nas tentativas) é o padrão mais robusto para pipelines de coleta que rodam sem supervisão humana constante.