cuducos / minha-receita

🏢 Sua API web para consulta de informações do CNPJ da Receita Federal
https://minhareceita.org
MIT License
1.32k stars 132 forks source link

Utiliza um “cache” de chave/valor para acelerar o ETL (comando `transform`) #173

Closed cuducos closed 1 year ago

cuducos commented 1 year ago

Resumo

Esse PR utiliza o Badger para acelerar o processo de ETL. O Badger é um armazenamento em disco de pares chave e valor, com alta performance em escrita e leitura de dados, e 100% escrito em Go — o que permite que ele seja utilizado no Minha Receita sem adicionar nenhum outro serviço externo.

Contexto

Como explicado no guia de contribuição, o processo de ETL era o seguinte:

  1. Criar um JSON com as informações de cada estabelecimento (hoje, aprox. 54 milhões de linhas de CSV, uma linha por CNPJ)
  2. Enriquecer esse JSON, direto no banco de dados, com informações extras (base do CNPJ, quadro societário, e informações sobre o Simples e MEI; aproximadamente 107 milhões de linhas de CSV)

Hoje, o processo todo leva mais de 12h no meu computador pessoal, pois o “enriquecer” é uma sequência de UPDATE no Postgres editando o conteúdo do JSON — uma operação cara, computacionalmente falando. Esse PR inicia com um protótipo eadadbe144aa636d6b111d2f4a640bb5cefbbd2f mudando esse funcionamento para:

  1. Criar um “cache” simples, de escrita e leitura rápida, para o conteúdo do enriquecimento (as 107 milhões de linhas de CSV)
  2. Ler cada CNPJ (as 54 milhões de linha), enriquecer utilizando o cache, e só então escrever o JSON no Postgres

Prós e contras

Esse novo formato requer um espaço extra em disco de aproximadamente 8Gb, mas roda em pouco mais de 1h (ao invés de mais de 12h, como era antes).

Como 8Gb é relativamente pouco para um projeto que por si seo requer cerca de 150Gb, acho a alternativa interessante.

O que falta

Possibilidades que o uso do Badger proporciona no futuro (fora do escopo desse PR)