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.