DEV Community

Francisco Zanfranceschi
Francisco Zanfranceschi

Posted on

[Desafio] - 10 Desafios Simples de System Design: Resolução 2/9 (Processamento Idempotente de Arquivos)

Conteúdo original em https://twitter.com/zanfranceschi/status/1640552419531837440


Ei dev,

Discussão sobre a resolução do Desafio 2/9 dos 10 Desafios Simples de System Design que postei recentemente.

"Processamento Idempotente de Arquivos"

Image

https://twitter.com/zanfranceschi/status/1638232588174397440


Idempotência é a característica que uma operação tem de ser chamada múltiplas vezes com a mesma entrada e isso não alterar o resultado final. Nesse desafio, estamos falando sobre processar o mesmo arquivo mais de um vez e isso não causar problemas, inconsistências, duplicidades.


Vamos então definir o nosso problema. Temos um arquivo de texto recebido diariamente em um diretório. O escopo da solução vai até colocarmos todas as linhas desse arquivo em uma tabela de banco de dados. Não vamos discutir o processamento em si.


De maneira geral, para processamento idempotente de arquivos temos duas grandes forma de se pensar:

  1. Idempotência do arquivo como um todo; e

  2. Idempotência dos registros dentro do arquivo. Ou seja, idempotência linha a linha, por exemplo.


  1. Idempotência do Arquivo

Essa é a forma mais simples, pois o controle do que foi ou não processado é único por arquivo. Uma forma simples de resolver esse problema é através de uma tabela de controle dos arquivos que já foram processados.


Essa tabela precisa identificar unicamente um arquivo para que este não seja processado mais de uma vez. A maneira mais segura de se fazer isso é através da verificação do conteúdo do arquivo. Usar verificações de checksums para isso pode ser um bom caminho.

Image


Comparação de checksums é comumente usada para verificação da integridade de dados. O exemplo da imagem abaixo mostra como extrair checksums com md5 de um arquivo usando o comando md5sum. O resultado poderia ser salvo na tabela de controle para evitar mais de um processamento.

Image


Ainda, esta técnica independe do nome do arquivo. Pode ser tentador usar os nomes dos arquivos como chave de idempotência, mas pode acontecer de um arquivo "xpto" acabar sendo renomeado para "xpto (1)". Quem nunca, né?


Existem também arquivos que possuem cabeçalho na primeira linha de seu conteúdo. Se esse conteúdo for seguro o suficiente para garantir unicidade, vale usá-lo também. Dessa forma, economiza-se processamento para extrair os checksums do arquivo, pois isso pode ser lento.


Em conjunto com essa estratégia de tabela de controle, é importante adotar uma forma de correlacionar os dados processados com esse controle para que se for necessário reprocessar um arquivo, os registros possam ser, p.ex., excluídos de alguma forma antes do reprocessamento.


  1. Idempotência dos registros dentro do arquivo

Essa é a forma mais granular e, se você entendeu como fazer esse controle por arquivo, basta aplicar a mesma técnica só que para cada registro do arquivo – linha a linha.


Por exemplo, em vez de usar o cabeçalho ou verificação de checksums do arquivo todo como na primeira abordagem, usa-se algo que identifique unicamente uma linha – uma "chave primária" da linha ou até mesmo verificação checksums quando necessário.


A escolha de quando usar uma técnica ou outra depende da sua necessidade. Pondere se o controle granular – linha a linha – vale a pena. Geralmente, a primeira abordagem é mais simples e suficiente para a maioria dos casos.


Claro, existem também casos onde simplesmente não é necessário fazer esse tipo de controle de idempotência, pois os dados serão usados de forma individual e ter registros parcialmente vindos de um arquivo não seria um problema.


Uma dimensão importante sobre o processamento de arquivos é o uso de memória. Muitas vezes um arquivo é enorme e carregá-lo todo na memória pode exigir máquinas muito caras (memória é mais caro do que armazenamento).

Esse desafio pode te ajudar a pensar sobre isso.

https://twitter.com/zanfranceschi/status/1532505851658784768


Se o conceito de idempotência ainda não estiver muito claro pra você, essa thread talvez te ajude a criar uma intuição melhor sobre o assunto.

https://twitter.com/zanfranceschi/status/1505694913496817667


Espero que tenha curtido essa thread. Qualquer dúvida ou sugestão é só comentar aí.

Muito obrigado se leu até aqui! ❤️

Top comments (0)