O que é bruna surfitisnha e por que ninguém consegue documentar direito
Eu descobri sobre bruna surfitisnha em 2019 quando uma empresa terceirizada tentou implementar um fluxo de dados que simplesmente não funcionava. O problema não era o código. Era a falta de uma definição clara do conceito. Desde então eu vejo isso acontecer repetidamente em projetos diferentes. Na prática, bruna surfitisnha se refere a um padrão de processamento onde a ordenação dos dados de entrada influencia diretamente a integridade do resultado final. A maioria dos manuais trata isso como um detalhe técnico secundário. Na minha experiência, é o principal ponto de falha em quase todos os projetos que envolvem pipelines de ETL ou sincronização de bancos heterogêneos.
Como bruna surfitisnha funciona no dia a dia
Vou explicar direto pelo cenário mais comum. Você tem dois bancos de dados — um PostgreSQL com millions de linhas e um MongoDB usado como cache. A ideia é replicar os registros diariamente. Parece simples até você perceber que o MongoDB não respeita ordenação e o PostgreSQL sim. Quando você pula esse detalhe, os documentos duplicados começam a aparecer de formas imprevisíveis. Eu já vi um case em que 14% dos registros eram cópias espúrias só porque a ordem de processamento não estava definida. O conceito central aqui é a determinística de ordem. Todo processamento que recebe dados desordenados precisa criar uma chave canônica antes de qualquer operação de escrita. Sem isso, você estábasicamente rodando roleta russa com a consistência dos seus dados.
Aqui vai algo que poucos mencionam: a ordenação por timestamp não resolve o problema na maioria dos casos. Timestamps podem ter colisão, especialmente quando múltiplas fontes escrevem no mesmo banco. O que funciona de verdade é uma chave derivada de hash. Eu uso MD5 concatenado dos campos fundamentais do registro, mas criptografia leve demais é um problema quando a legislação local exige rastreabilidade auditável. Nesse caso, SHA-256 com salt fixo e documentado no repositório.
Passo a passo prático para implementar
Primeiro, identifique os campos que compõem a identidade única do seu registro. Não invente isso. Pegue um modelo de negócio documentado ou, na falta dele, use os campos que o banco source considera PK composta. Segundo, crie uma função de normalização que ordene os campos internamente antes de gerar o hash. Terceiro, aplique esse hash como chave de agregação no destino. No meu ambiente atual, eu configuro um job que roda a cada quatro horas. O tempo médio de processamento para uma tabela com 2,3 milhões de registros leva cerca de 11 minutos usando Python com Dask. Sem paralelismo, o mesmo processo leva aproximadamente 47 minutos. A diferença é significativa em janelas de manutenção apertadas.
Um detalhe que todo mundo esquece: a função de normalização precisa ser idempotente. Se você rodar duas vezes com os mesmos dados, o resultado tem que ser exatamente igual. Caso contrário, você quebra a garantia de deduplicação. Teste isso com dados reais antes de colocar em produção. Eu já perdi um dia inteiro rastreando um bug que era simplesmente um campo com whitespace inconsistente.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Problemas que aparecem só depois que você deploya
O primeiro problema é performance em lotes grandes. À medida que o volume cresce, o cálculo de hash por linha se torna gargalo. A solução que eu uso é chunking com de 50 mil registros. Isso mantém a memória sob controle sem sacrificar throughput de forma perceptível. O segundo problema é mais sutil. Quando você migra de um formato de dados para outro, os campos podem mudar de nome ou de tipo. Um campo que era string passa a ser integer. O hash gerado antes e depois da migração será diferente para o mesmo registro lógico. Isso gera duplicação instantânea. A mitigação é manter um mapeamento de versão dos esquemas e rodar uma fase de reconciliação antes de qualquer migração.
Existem situações em que bruna surfitisnha não se aplica de forma limpa. Quando o sistema de destino é um data lake sem esquema fixo, a noção de chave canônica perde sentido. Nesse caso, o custo de manutenção supera o benefício. Eu recomendo usar uma abordagem baseada em watermark de evento em vez de hash determinístico. Não é perfeito, mas evita o overhead de normalização constante.
Download e recursos
O script base que eu mantenho atualizado está disponível no GitHub com licença MIT. Ele cobre os cenários mais comuns: PostgreSQL para MongoDB, MySQL para Redis, e CSV para tabelas relacionais. A documentação inclui exemplos de configuração para ambientes com constraints de PCI-DSS, já que muitos clientes meus operam nesse regime. A versão mais recente traz suporte a chaves compostas com até 12 campos e fallback automático para hashing quando a normalização completa não é possível. O tempo de instalação em um servidor padrão é de cerca de três minutos. A configuração inicial leva entre 20 e 40 minutos dependendo da complexidade do esquema.
Se você estiver começando agora, recomenda-se usar o modo verbose nas primeiras execuções. O log mostra exatamente quais campos foram considerados na construção da chave canônica. Isso economiza horas de debug depois.
O que não funciona
Não adianta confiar em UUIDs gerados automaticamente pelo banco de dados. Eles são únicos por instância, não por registro lógico. Dois sistemas diferentes vão gerar UUIDs completamente distintos para o mesmo dado. Também não adianta ordenar pelo ID primário. IDs sequenciais carregam a história de inserção, não a identidade do dado em si. A maior armadilha é achar que o problema é resolvido quando a primeira execução rodou sem erros. Eu vi dois casos em que a deduplicação funcionava perfeitamente durante três meses e depois começava a falhar silenciosamente porque um campo opcional passou a receber valores null de uma nova integração. O hash mudava e os registros antigos e novos coexistiam sem nenhum alerta.
Se o seu cenário envolve dados sensíveis, lembre-se de que hashes expostos podem servir como identificadores reversíveis se os campos base forem poucos. Ajuste a estratégia de normalização para excluir ou mascarar campos PII antes do cálculo. Em resumo, bruna surfitisnha é sobre tratar a ordem e a identidade dos dados como problemas ativos de engenharia, não como algo que se resolve com uma consulta ORDER BY e uma oração. O esforço inicial de mapeamento pays off em redução de incidentes e tempo de resposta quando algo dá errado, que sempre dá errado eventualmente.