Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

Produto:

Solucoes_totvs
SolucaoTOTVS Varejo Franquias e Redes

Linha de Produto:

PDV Sync

Segmento:

Segmentos_totvs
Segmento Varejo

Módulo:PDVSync.Core.Controle - Hangfire
Função:
País:Brasil
Ticket:
Requisito/Story/Issue (informe o requisito relacionado) :

DVARINT1-14507


02. SITUAÇÃO/REQUISITO

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.

...

  • Foi criado um Job recorrente no projeto de Hangfire chamado: FazerBackupDadosFilaAsync que buscar os dados no banco, faz o upload dos mesmo para o GCS e deleta os arquivos. As regras de secução são as seguitnes:
    • Roda todo dia de 1 à 5:59 da manhã, dessa forma evita a concorrência com os demais serviços que rodam durante o dia;
    • Primeiro é obitodo a lista de Inquilinos que possuem dados com status "Enviado para MS Responsável" (5); Depois:
    • Obtem todos os dados com status igual ou superior a "Enviado para MS Responsável" (5);
    • Os dados são obtidos de forma páginada, sendo 800 registro por vez e aplicando os filtros de status, inquilino e data de cadastro;
    • O job trabalha com um range de datas;
      • A data de início é a data de cadastro do dado mais antigo com o status citado, e a data de fim é a data anterior a data de execução do job;
    • Além de paginar os dados ao consultar o banco, o job calcula uma média de tamanho dos dados, e caso estes sejam superior a 1GB, esses dados são dividos em bloco menores;
    • O Upload é feito em stream, e primeiro salva os dados em um arquivo temporário, e realiza o stream para o GCS. Com esta abordagem, o consumo de memória é drasticamente reduzido;  
  • O RTS foi alterado para mudar o status dos dados para  5 após o envio com sucesso para o MS Reponsável.
    • Isso já ocorria no fluxo com Workflow, e foi replicado na fluxo comum.

AppSettings

  • O tempo de execução do Job é definido através da variável "Hangfire:SchedulerFazerBackupDadosFilaAsync";
  • O nome do bucket no qual os dados serão salvos é definido através da variável: "JobBackupFila:Bucketname". O nome utilizado é "dev-backup-dados-fila" no ambiente de DEV.
    • Deve-se solicitar a criação do bucket para os demais ambientes (QA, STG e PRD), de preferência com uma data para expurgo automático dos dados.  

Estrutura dos Arquivos

No bucket, os dados são salvos seguindo a estrutura de pastas tem a seguinte hierarquia: ano/mês/dia/arquivo.json

Já os arquivos seguem tem o seguinte padrão: idInquilino_{X}_yyyyMMddHHmmss_{Guid}_{PartNumber}.json
Exemplo de valor completoEx: 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.

Funcionamento e Métricas

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 DadoQtd DadosTamanho Dado
Cliente397061327.76MB
Preço748955380.14MB

Produto

131001209.76MB
Venda3155.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 DadoQtd DadosTamanho DadoTempo Processamento
Produto - Lote153k382.5MB1m 15s
Produto - Lote454k1.1GB3m 10s

Venda

2k37.42MB12s
Venda - Lote146k3.42GB12m

Obs.: O dados em Lote são dados que possuem mais de um item por registro no banco. Produto por exemplo, possui mil registro, 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 londo 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.4.54GB processado em 12min