Reutiliza metadados entre processamentos de logs - #132
Merged
pitangainnovare merged 3 commits intoAug 29, 2026
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Descrição do PR
O que esse PR faz?
Implementa um cache local ao processo para reutilizar os metadados de documentos e fontes durante o processamento sequencial de logs.
A alteração:
DocumentouSource;URLTranslationManagere um novo tradutor para cada log;PARSING_METADATA_CACHE_COLLECTIONS.O cache foi separado da preparação dos metadados:
metadata.pycontinua responsável pela seleção do tradutor e construção do manager;metadata_cache.pyconcentra assinatura, armazenamento, invalidação, sincronização e isolamento dos objetos mutáveis.Não foi utilizado
functools.cache, pois ele não oferece a invalidação necessária quando o PostgreSQL é atualizado e poderia manter todas as coleções simultaneamente na memória.Também não foi utilizado o cache Django/Redis porque isso exigiria serializar e transportar estruturas potencialmente muito grandes. O objetivo é reutilizar esses dados diretamente na memória do processo Celery responsável pelo parsing.
Onde a revisão poderia começar?
A revisão pode começar por:
metrics/services/parsing/metadata_cache.pymetrics/services/parsing/metadata.pyconfig/settings/base.pyconfig/collections.pymetrics/tests/parsing/test_metadata_cache.pyComo este poderia ser testado manualmente?
Executar a suíte de métricas:
Resultado obtido:
Confirmar que nenhuma migration foi introduzida:
Resultado obtido:
Para observar o comportamento durante o processamento, executar dois logs consecutivos da mesma coleção e verificar os registros:
Ao alternar a coleção, o registro esperado é:
Também é possível desabilitar ou restringir o cache por ambiente:
Algum cenário de contexto que queira dar?
Antes desta alteração, cada log reconstruía integralmente os dicionários gerados por
Document.metadata()eSource.metadata().Na coleção PRT, com 35.020 documentos e 102 fontes, 25 preparações isoladas apresentaram:
No teste manual de três logs completos da PRT, os payloads com e sem cache apresentaram exatamente os mesmos:
As 26 coleções estarem habilitadas não significa que todas serão carregadas na memória. Cada processo mantém somente a coleção usada mais recentemente. Isso limita o consumo de memória, especialmente em workers que podem receber mais de uma coleção.
Os workers de parsing operam com concorrência igual a 1, o que favorece a reutilização sequencial. Ainda assim, o acesso ao cache é protegido por lock.
Screenshots
N/A
Quais são os tickets relevantes?
Parte de #128
Referências
Document.metadata()eSource.metadata().Segurança da informação (NSI.04)
Este PR manipula dados sensíveis ou pessoais (LGPD)?
Este PR altera autenticação, autorização, controle de acesso ou gerenciamento de sessão?
Este PR introduz, atualiza ou remove dependências de terceiros?
Este PR foi validado pelo pipeline de segurança (SonarQube / Trivy)?
Pendente de preenchimento após a execução do pipeline do pull request.
Este PR concatena, monta ou executa comandos SQL, HTML ou JavaScript a partir de entrada externa?
A implementação executa somente uma instrução SQL fixa para configurar a transação de leitura, sem incorporar entrada externa.
Este PR expõe novos endpoints, telas ou serviços?
Algum segredo, senha, chave ou token está sendo adicionado ao código-fonte?