tst-labs / esocial

O esocial é o projeto que reune as iniciativas do TST para atender às necessidades do sistema eSocial do Governo Federal.
BSD 3-Clause "New" or "Revised" License
116 stars 70 forks source link

Queda no desempenho na montagem de lotes #402

Open lucasbhti opened 8 months ago

lucasbhti commented 8 months ago

Prezados, bom dia.

Trabalho no Tribunal de Justiça do Estado de Minas Gerais e utilizamos esta aplicação para nos comunicarmos com o eSocial.

Devido a uma indisponibilidade temporária do eSocial-Gov, mais de 25 mil ocorrências de remuneração e pagamento acabaram ficando reprezadas no trasnsmissor. Quando o eSocial-Gov foi restabelecido, o serviço de montagem de lotes ficou extremamente lento, demorando em média 20 minutos para montar os lotes de 50 ocorrências.

Ao analisar a situação, chegamos a conclusão que o problema estava acontecendo no ponto abaixo (TarefaEnvioEventos.java a partir da linha 63):

List<EventoDTO> eventosHabilitados = eventosEmFila.stream() .filter(evento -> regrasFactory.getRegra(evento).habilitado(evento)) .limit(LIMITE_EVENTOS_LOTE) .collect(Collectors.toList());

Neste ponto, ao aplicar o "comando `filter(evento -> regrasFactory.getRegra(evento).habilitado(evento))" as regras de habilitação são executadas para todos os itens da lista "eventosEmFila", mesmo o lote possuindo uma quantidade máxima estabelecida.

Para contornar o problema alteramos o trecho da seguinte forma: List<EventoDTO> eventosHabilitados = new java.util.ArrayList<EventoDTO>(); Long contador = 0l; for(EventoDTO evento : eventosEmFila) { if(regrasFactory.getRegra(evento).habilitado(evento)) { eventosHabilitados.add(evento); contador++; }
if (contador.equals(LIMITE_EVENTOS_LOTE)) break; }

A intenção foi simplesmente evitar a execução desnecessária da validação de habilitação se a lista de habilitados já tiver alcançado o número máximo estipulado. Após esta alteração, a montagem do lote passou a ser realizada em menos de 5 segundos.

Certamente existem controles mais completos que poderiam ser implantados, como o carregamento da lista "eventosEmFila" por tipo de evento (tabela, não-periódicos e depois periódicos) que também traria melhorias na performance de montagem de lote, mas esta simples alteração já foi suficiente para desafogarmos a montagem de lotes.

Sendo assim, fica a proposta de melhoria.

Obrigado pelo excelente trabalho.