Gerando relatórios complexos, a saga!

Anderson Salles
maisUmblogDeTecnologia
3 min readApr 1, 2021
Photo by Carlos Muza on Unsplash

Já trabalhei com diferentes tipos de geração de relatórios, simples e extensos, complexos porém curtos e os mais devastadores: complexos e extensos. num contexto de desenvolvimento web, onde o usuário possa querer imprimir por algum motivo todos os dados gerados, qual o limite do bom senso?

O que é ideal para o usuário de um Erp web? quantos registros ele quer ver em tela? a paginação pode interferir na impressão desses registros? Qual o indicador para que este relatório seja processado de forma paralela?

Posso passar a considerar: “Se não dá timeout tá bom” ou até mesmo: “Na média isso funciona para todo mundo”. Neste contexto, comecei a rabiscar algumas alternativas para geração de relatórios complexos, provavelmente existem soluções melhores (pois não investiguei a fundo e este é um problema rotineiro), porém juntei alguns estudos de AWS, e cheguei em uma possível solução:

Proposta de processamento de relatórios

Minha ideia com esta proposta inicial de arquitetura é explorar cada ponto e conseguir responder o porquê de cada coisa, avaliando preço, alta disponibilidade e escalabilidade. Um texto explorando cada possibilidade talvez. Posso explorar a azure também. Acredito que o imutável nessa proposta é a necessidade do relatório e possivelmente o banco SQL (Poderia ser SQL Server ou MySql) pois pensando em aplicações convencionais a maioria lida com bancos relacionais.

A lógica geral tem 3 partes: Client solicita a geração desse relatório, ele é processado e o resultado em JSON é armazenado em uma base NoSql (neste momento mongo, porém poderia ser um Cassandra, ou talvez um elasticSeach?) e o Client é avisado via email que o relatório já está pronto para ser acessado. Nesse contexto o usuário poderia fazer uma busca simples no banco, trazendo todos seus relatórios já gerados.

A aplicação cliente está em angular porque sim, poderia ser qualquer outra.

Neste contexto, a solicitação do cliente por um novo relatório, faz a chamada de uma api rest que aciona um AWS Lambda, este Lambda adiciona a solicitação em uma fila utilizando o AWS SQS e esta fila aciona um segundo lambda que busca os dados necessários no banco de dados relacional e armazena os dados processados no banco de dados NoSql para quando solicitado pelo Client este seja retornado por meio de um terceiro lambda.

Uma limitação já de cara desta proposta é o tempo de processamento do relatório, pois caso ele precise de mais de 15 minutos para ser gerado, as configurações do lambda não suportariam (https://docs.aws.amazon.com/whitepapers/latest/serverless-architectures-lambda/timeout.html)

Abordarei inicialmente a configuração do API Gataway + Lambda + SQS, possivelmente em duas partes, uma avaliando as estratégias outra mostrando um pouco do resultado.

Tecnologias Citadas:

AWS Api Gataway
https://aws.amazon.com/pt/api-gateway/

AWS Lambda
https://aws.amazon.com/pt/lambda/

AWS SQS
https://aws.amazon.com/pt/sqs/

PostgreSQL
https://www.postgresql.org/

MongoDB
https://www.mongodb.com/

.Net 5
https://dotnet.microsoft.com/

Angular
https://angular.io/

https://media.giphy.com/media/xUPOqo6E1XvWXwlCyQ/giphy.gif

--

--