Blog · 6 de agosto de 2026
A idempotência é a maior parte do trabalho
Todos os pipelines voltam a ser executados. Depois de uma falha, depois de uma correção, depois de alguém carregar duas vezes no botão. Se isso é rotina ou um incidente decide-se no desenho.
3 min de leitura
Um pipeline vai voltar a ser executado. Não é talvez, é certo. A rede cai a meio, alguém corrige um bug e recarrega uma semana, um operador não tem a certeza de que o processo terminou e lança-o outra vez.
A única pergunta verdadeira é o que acontece da segunda vez. Se voltar a executar é seguro e aborrecido, a maioria dos problemas operacionais fica pequena. Se não for, cada falha transforma-se numa investigação sobre o estado em que os dados estão.
Acrescentar é a armadilha
O carregamento mais simples é um insert, e os inserts não são idempotentes. Corra o ficheiro de ontem duas vezes e ontem passa a existir duas vezes. Nada dá erro. O número de linhas parece plausível. A faturação de um dia duplica discretamente, e isso é descoberto semanas depois por alguém que se lembra de que aquela terça-feira não foi assim tão boa.
A solução é fazer com que o carregamento vise um estado e não um evento: esta chave deve acabar com estes valores. Se isso é um merge, um upsert ou delete-then-insert numa partição delimitada importa menos do que a propriedade: executar duas vezes deixa o mesmo resultado que executar uma.
Precisa de uma chave que signifique alguma coisa
Fazer merge exige saber o que torna uma linha a mesma linha. Um id substituto gerado no carregamento não consegue fazê-lo; por definição, é diferente em cada execução.
Por isso precisa de uma chave de negócio: um número de encomenda, uma referência de transação, uma combinação do sistema de origem com o id de origem. Se a origem não tem mesmo uma chave estável, vale a pena dizê-lo cedo, porque qualquer estratégia de eliminação de duplicados a jusante será um palpite construído sobre isso.
Se não consegue dizer o que torna duas linhas a mesma linha, não consegue tornar o carregamento repetível. Tudo o que vem depois é esperança.
As partições tornam as repetições baratas
É aqui que a idempotência e o carregamento incremental se encontram. Se os dados estão particionados por dia e um carregamento é dono da sua partição por inteiro, voltar a executar um dia é trivialmente seguro: substitui-se a partição. Sem lógica de merge, sem correspondência de chaves, sem ambiguidade.
É muitas vezes o desenho correto mais simples, e vale a pena recorrer a ele antes de algo mais engenhoso. Deixa de funcionar quando os registos mudam de partição depois do facto, como uma correção tardia a uma encomenda antiga, que é precisamente quando precisa do merge.
O retorno operacional
Quando voltar a executar é seguro, o procedimento de recuperação para quase tudo passa a ser o mesmo: executar outra vez. Os backfills deixam de ser especiais. Um processo que falhou às 3 da manhã pode esperar pela manhã. Um operador nervoso que clica duas vezes não é um incidente.
É por isso que vale a pena dedicar-lhe tempo de desenho cedo. Não por ser elegante, mas porque transforma toda uma categoria de problemas das 3 da manhã numa categoria de problemas comuns.
- Pipelines
- Arquitetura
- Fiabilidade
Quer isto para o seu negócio?
Diga-nos o que demora demasiado tempo ou o que quer melhorar.