Nota técnica
Como tornei o pipeline idempotente
Reexecução sem duplicar pedido: estado, chave de negócio e Silver que não cresce duas vezes.
- Python
- Pandas
- Parquet
01 — Problema
Segunda execução do mesmo lote duplicava linhas no fato e inflava métricas de volume e perda.
02 — Hipótese
Se a chave de negócio do pedido for o contrato de unicidade em Silver, reprocessar Bronze não cria pedido novo.
03 — Implementação
Deduplicação em Silver por order_id (último evento vence) e fato Gold com grão explícito de um pedido.
04 — Resultado
Replay de Bronze reconstrói Gold sem duplicar o grão, no pipeline local do Delivery Audit.
05 — Aprendizado
Idempotência é propriedade do grão e da chave, não do orquestrador. Airflow só dispara de novo; o pipeline tem que saber dizer não.
Retries de orquestração expõem a falta de idempotência. O recorte abaixo está no pipeline do Delivery Audit. Um orquestrador que reexecuta um job não-idempotente apenas automatiza a duplicação.
Problema
primeira execução
↓
processa dados
↓
segunda execução (retry / backfill)
↓
DUPLICAÇÃO
No fato com grão “um pedido”, duas linhas para o mesmo order_id quebram taxa de cancelamento, SLA e qualquer soma de perda. O sintoma parece analytics. A causa é contrato de unicidade ausente.
Hipótese
Se Silver materializa um registro por pedido (último estado conhecido) e Gold não faz append cego, a segunda passagem sobre o mesmo Bronze é replay, não acúmulo.
Implementação
- Bronze permanece append-only — histórico da origem.
- Silver resolve conflito por
order_id(último timestamp da jornada vence). - Gold reconstrói
fact_ordersa partir de Silver, não empilha sobre a execução anterior. - Flags de auditoria são recalculadas sobre o fato reconstruído.
Isso é idempotência de lote completo. Idempotência incremental (merge por partição de data) é o passo seguinte, típico de DAG Airflow com execution_date.
Resultado
primeira execução
↓
processa dados
↓
segunda execução
↓
detecta estado (chave já vista)
↓
não duplica
No pipeline local, reprocessar o mesmo extrato não duplica order_id no fato.
Aprendizado
Colocar retries=3 no operador sem chave de negócio gera incidente. A ferramenta de orquestração não define unicidade. O grão define.
O teste mínimo: executar o lote duas vezes e verificar count(distinct order_id) = count(*).