| Produto: | TOTVS Varejo Franquias e Redes |
|---|---|
| Linha de Produto: | PDV Sync |
| Segmento: | Varejo |
| Módulo: | PDVSync.Core.Controle - Hangfire |
| Função: | |
| País: | Brasil |
| Ticket: | |
| Requisito/Story/Issue (informe o requisito relacionado) : |
Eliminar a duplicidade de armazenamento do conteúdo dos dados processados no CommerceHub, liberando espaço no banco da fila após o processamento e garantindo a preservação do histórico no bucket de forma segura, eficiente e com melhor custo-benefício.
No bucket, a estrutura de pastas tem a seguinte hierarquia: ano/mês/dia/arquivo.json
Já os arquivos tem o seguinte padrão: idInquilino_{X}_yyyyMMddHHmmss_{Guid}_{PartNumber}.json
Ex: 2025/12/11/idInquilino_15_20251208091220215_596031ae7eb24d029bd7ab0b1ab3033c_001.json
Obs.: O PartNumber representa o indice do dado dentro do lote de dados. Como dito antes, arquivos maiores que 1GB são didividos em blocos menores, cada bloco de dado recebe um número que se inicia em 1,
este valor é o PartNumber.
Para direcionar o desenvolvimento, foi consutado a quantidade de dados gerados em dia na V3 em Produção. Levou-se em consideração os dados mais comuns e que geram mais volume, sendo eles:
Cliente, Preço. Produto e Venda. Chegou-se aos seguintes dados:
| Tipo Dado | Qtd Dados | Tamanho Dado |
|---|---|---|
| Cliente | 397061 | 327.76MB |
| Preço | 748955 | 380.14MB |
Produto | 131001 | 209.76MB |
| Venda | 315 | 5.77MB |
Com o intuito de validar a solução, nos testes, foram utilizados valores superiores aos mostrados acima. Os testes foram feitos com Produto e Venda, que são dados mais volumosos. Seguem os resultados:
| Tipo Dado | Qtd Dados | Tamanho Dado | Tempo Processamento |
|---|---|---|---|
| Produto - Lote | 153k | 382.5MB | 1m 15s |
| Produto - Lote | 454k | 1.1GB | 3m 10s |
Venda | 2k | 37.42MB | 12s |
| Venda - Lote | 146k | 3.42GB | 12m |
Obs.: O dados em Lote são dados que possuem mais de um item por registro no banco. Produto por exemplo, possui mil registros, logo, são 153 (ou 454) linhas no banco, mas que totalizam 153 (ou 454) mil itens que serão salvos no Dado Dinâmico.
Venda possui um lote de 146 itens, e mil linhas/registros no banco , logo foram 146 mil vendas processadas no teste.
Ao longo do desenvolvimento, diversas melhorias foram realizadas. No modelo final, com otimizações principalmente no uso de memória, conseguiu-se processar todos os dados do banco (4.54GB) em 12min.
Vale ressaltar que o maior ofensor da ferramenta é o uso de memória. Para processar todo o banco (4.54GB), a aplicação chegou a utilizar 7.7GB de memória RAM. Após o termino do processamento, esse número baixou para 1.1GB, sendo que parte desse
valor, se da pelo fato da aplicação deixar a memória reservado, ou seja, ela não está sendo usada de fato, o que não onera o uso por outras aplicações que estejam rodando da máquina.
Os dados podem ser consultados diretamente no GCS, seguindo a estrutura estabelecida é possível via filtro da plataforma, localizar os dados de um inquilino em uma determinada data.
Também é possível consutar os dados através da Lib .Net fornecida pelo Google, porém, seria necessário o desenvolvimento dessa funcionalidade.
Com relação a análise dos dados gerados, percebe-se que pode haver algumas dificuldades, visto que os arquivos normalmente terão um grande volume de dados (até 1GB). Pensando nisso, remomenda-se criar uma ferramenta capaz de "dividir" os arquivos em arquivos menores, dessa forma, a leitura dos mesmos se torna mais fluida. Abaixo segue um scrip shell que faz exatamente essa função, de dividir os arquivos em partes de até 100MB.
Para utililiza-lo, basta abri-lo em um editor de texto, colocar o caminho do arquivo na variável "INPUT_FILE", abrir o Terminal/CMD e executar o script. O único requerimento é que a máquina tenha o Python3 instalado.
Os arquivos serão salvos na mesma pasta dos arquivos originais com o sufixo: "_output_0001".