Executando verificação de segurança...
5

Desafios do backend (qual sua responsabilidade?)

Imagine uma aplicação web que tem como framework de frontend o Next.js. Além disso, este aplicativo precisa ter um banco de dados para lidar com usuários e algumas outras coisas. Porém, o desafio vem a seguir:

Esta aplicação irá lidar com muitos dados, manipulação e cálculos físicos. Eu queria saber se o backend que lidaria com essa parte dos dados. Por exemplo, o usuário define alguns valores em um formulário e clica em "Gerar gráfico". Então, esses dados devem ir pra algum serviço para ser gerado um dataframe completo com os dados gerados por um cálculo. Essa responsabilidade deveria ser do framework backend?

Pergunto isso pois a minha empresa tem muito mais dev javascript e queríamos construir este app com o Next.js no back (ou Express), mas vejo que esse tipo de manipulação de dados e geração de gráficos tem muito mais suporte no Python e os engenheiros da empresa sabem programar com bibliotecas com Pandas, etc. Qual seria a abordagem ideal? Teria como criar um serviço a parte só para esses dados que conversaria com o backend e o frontend?

1

Acredito que essa reponsabilidade de reendenizar o gráfico deve ser totalmente do client (Front-end), o Back-end somente recebe a requisição como por exemplo um http://api/v1.0/generate-graph e retorna a lista de dados que deve ser reendenizada no gráfico.

Exemplo:

[
  { "nome": "Categoria A", "valor": 25 },
  { "nome": "Categoria B", "valor": 40 },
  { "nome": "Categoria C", "valor": 15 },
  { "nome": "Categoria D", "valor": 30 }
]

Pelo menos eu faria isso, afim de não sobrecarregar a api com tarefas que claramente podem se executadas pelo front-end.

1

Mas náo é só isso que entra. Tem vários cálculos que, por exemplo, utilizam um serviço de cálculo em C++ criada pelos engenheiros daqui. Por isso que eu queria saber como é feito nas grandes empresas. São serviços separados? O backend só deveria ser responsável unicamente em lidar com o banco de dados e queries?

1

Bom, se você precisa fazer vários calculos complexos, é recomendado que seja feito em um serviço separado, porque o serviço principal da sua aplicação poderá continuar lidando com várias requisições simples, enquanto sua api de calculos poderia processar os calculos e somente quando estiverem prontos serem enviados ao client.

Fazendo desta forma, evitatoms que o serviço principal sofra gargalos colocando as requisições em uma fila enquanto processa os calculos para retornalos ao client

Outra vantagem de construir com serviços separados são as otimizações, você poderá escolher a linguagem e arquitetura que melhor se encaixa as suas necessidades, com muito mais liberdade do que se fossem feitos no mesmo serviço.

Espero ter ajudado.

1

Acredito que esse desafio que esta enfrentanta seja de integração e uma alternativa seria um serviço de mensageria como RabbitMQ por exemplo.
Dessa forma você pode manter suas aplicaçoes desacopladas com um ponto em comum para trocarem dados. Isso favorece menor curva de aprendizado porque o RabbitMQ por exemplo e bem tranquilo, na escalabilidade do sistema, e suas equipes de devs ficam indepemedentes. Logico que pra isso e importante as equipes juntas elaborar uma padrao para troca de dados.

Empresas grandes com varias solucoes investem nessa alternativa para integrar suas diversas aplicaçoes, organizar e priorizar as tarefas em filas etc..

Talvez nao seja a melhor solução para o seu cenário mas considere isso.

Obs: O RabbitMQ funciona em docker o que facilita muito levantar o ambiente

Espero ter contribuido! ;)

1

Nesse caso não poderia ser utilizado APIs para manipular os dados enviados através do formulário? Por exemplo, daria para enviar os dados do formulário para uma API em Python ou alguma outra linguagem backend que manipule os dados e retorne as informações necessárias para que o frontend gere o gráfico, assim os dados poderiam ser manipulados em python e retornados para o frontend que você utiliza.

1

Sim, claro! Porém, é o que falei, os devs na nossa empresa são proficientes em frameworks backend com Javascript/Typescript, e não Python. Enquanto que nossos engenheiros são proficientes em Python.

Porém os devs não sabem os cálculos físicos e os engenheiros não sabem construir API's Rest. Por isso surgiu essa minha dúvida. Como dividir essas tarefas/frameworks?

1

Vamos por partes...

Parte 1:
Se a origem dos dados vem dos engenheiros que programam em Python com Pandas e cálculos em C++, está claro que vai ter que ter Python e C++. Esssa parte é bem tranquila, pois é bem fácil o Python usar bibliotecas compiladas em C++. Então dá para pegar o resultados dos cálculos e trazer para o Python.

Parte 2:
Tendo as funções que retornam os resultados dos cálculos em Python, é preciso exportar de alguma forma essa informação, então algum dev vai ter que fazer um app em Python expondo os resultados. Se for via API, pode ser com FastAPI, por exemplo. É bem fácil também.

Aqui uma dica: Como você mesmo falou, o Python tem bastante bibliotecas para manipulação de dados e geração de gráficos, portando essa API já pode retornar o HTML pronto do gráfico.

Parte 3:
Aqui é uma decisão estratégica da empresa. A empresa tem que decidir se quer:
1 - Desenvolver um backend em Javascript/Typescript, já que é o que os devs sabem mais, e consumir os dados da API Python, acessar banco de dados e todo o resto. Essa opção eliminaria a necessidade de treinar todos os devs em Python. Um só já daria conta de fazer a API Python.
ou
2 - Treinar seus devs e desenvolver todo backend em Python, já que uma parte precisa ser em Python. Essa opção eliminaria a necessidade de manter 2 aplicações separadas.

1

Pra gente, o ideal seria utilizar o próprio Next.js pra criar as API's. Colocar um serviço extra pra criar uma API pra entregar os resultados dos cálculos pro backend seria uma arquitetura ruim?

1

Pelo menos uma API em Python é necessária para expor os resultados, pois alguém vai ter pegar da programação dos engenheiros em Python (Parte 1).
Na Parte 3 fica a escolha da empresa, tanto backend como frontend (Parte 3).
Pode usar o Next.js para acessar diretamente os dados da API Python, por exemplo.