(Conceitual) Dúvidas sobre relação de domínios de microserviço

6 respostas
arquiteturaprogramaçãojava
Cleiton_Ribeiro_Dev

Olá pessoal, boa tarde. Tudo bem ? Espero que sim.
Eu programei bastante tempo no padrão “monolito” e agora tenho dificuldade em pensar no formato modularizado dos microserviços. Tenho algumas dúvidas relacionadas a como se delimitam os domínios de cada microserviço e a partir daí, como eles se relacionam e como acontecem as buscas.

Acredito que para discutirmos a questão, precisamos adotar um sistema de exemplo. Para garantir que todos falem a mesma lingua eu pensei em um exemplo :

Bom, imagine um sistema de controle de gastos daqueles em que as pessoas cadastram as entradas e saídas (incomes e outcomes) , ou seja, um sistema responsável por armazenar registro do dinheiro que aquele usuário gastou ou ganhou num determinado período (mensal/semanal/anual).

Agora, as dúvidas…

1 - Relações entre microserviços (Relações entre domínios/assuntos distintos)

Bem, o conceito de microserviço diz que cada domínio do software deve ser apartado e se transformar num serviço autônomo, certo ? Pois bem, eu tenho uma dúvida a respeito de como tratar os relacionamentos entre esses domínios. Considerando que exista uma relação entre o usuário & a despesa, como relacionar/amarrar esses dois assuntos dentro do cenário de Microservice ? Tenho algumas hipóteses, porém, não sei qual delas é incorreta. Uma dessas hipóteses seria criar um micro-service para o domínio Usuário e outro para Despesa. Considerando que existe uma relação entre Usuário/Despesa, seria possível amarrar a despesa diretamente ao usuário ou isso iria fazer com que o microserviço de Despesa fugisse da proposta de domínio? Por exemplo, eu poderia considerar que toda despesa recebe o código de um usuário já na sua criação, ou seja, quando acesso o MS de despesa e chamo o endpoint de criar uma nova despesa, poderia já passar o código do usuário. Essa abordagem seria incorreta ?

Uma outra dúvida seria em relação a como se dão as buscas dentro desse cenário de microservices, mais especificamente, como amarrar os dados de dominios diferentes. A questão é que a despesa deve se preocupar com o domínio de despesa e não deve se preocupar com o domínio de usuário (e vice-vesa), certo ? E se por exemplo, eu tiver a necessidade de consumir esses serviços para mostrar um relatório mensal das despesas de um determinado usuário, vou precisar mesclar dados de usuário & despesa, certo ? E agora ? Meu serviço de Despesa não pode retornar dados de usuário e nem o contrário seria possível.

Eu tenho uma última duvida ainda, porém, meu tópico ja está ficando longo e não sei se alguem teria a coragem de lê-lo.

Desde já, obrigado amigos. Espero contar com a ajuda de vocês.

6 Respostas

Lucas_Camara

Na minha opinião, essa abordagem é correta. Um princípio de microserviço é que cada um tem sua própria schema de banco. Com isso, qualquer referência à outro contexto microserviço é feito por uma chave identificadora.

O caso de relatório é algo um pouco diferente. Teria sim que sair coletando os dados de suas fontes até montar o relatório, porém, acredito que existam alternativas para fazer isso, dependendo do cenário do relatório.

javaflex

Antes de tudo veja se realmente é necessário ou se um monolito atenderia melhor. Senao só vai arrumar mais complexidade por moda.

Se for realmente microserviço com seu próprio banco de dados, vai ter que montar uma colcha de retalhos com o resultado de cada microserviço. Se forem “serviços” usando o mesmo banco de dados, pode fazer o SQL trazendo por completo as informações necessárias para o relatório ou outra funcionalidade atendida por um serviço.

javaflex

Da uma lida nisso também caso seja de interesse https://www.luiztools.com.br/post/api-gateway-em-arquitetura-de-microservices-com-node-js/

Lucas_Camara

Uma arquitetura de microserviços boa, tem um gateway, e há boas soluções para isso no mercado.

Muito bom o link @javaflex

Cleiton_Ribeiro_Dev

Lucas, acho que chegamos mais ou menos onde eu queria chegar.

1 - O API Gateway ao qual vc se refere é uma solução pronta, como por exemplo a solução da Amazon ou IBM, ou você se refere a uma outra aplicação escrita pelo próprio DEV para se comportar como um gateway ?

2 - Seria o gateway o facilitador do ponto de vista que seria capaz de consumir as informações de multiplos microserviços e constura-las, construindo resposta mais concreta ?

3 - Uma última dúvida que eu tenho é referente ao N+1…

Imagine que meu intuito no front-end é mostrar pro usuário uma lista de usuários e suas respectivas despesas. Seria então necessário consumir a lista retornada pelo serviço de despesas, afinal, cada despesa conhece o código do usuário responsável, até ai tudo bem, o ponto é que imagino que tenhamos algumas alternativas em vista :

1 * Retornar todas as despesas do serviço de despesas e com base nos códigos dos usuários das despesas fazer uma nova busca (bulk) no serviço de usuários.

2 * Usar um API Gateway para consumir o serviço de despesas e faze-lo costurar os resultados com o serviço de usuários (é possível ?)

3 * Com base na lista de despesas, iterar a lista e chamar repetidas vezes o serviço de usuário para preencher os dados de usuário de cada linha do serviço de despesas (IMPENSÁVEL) - EXEMPLO DO “NÃO FAZER”

Lucas_Camara

A princípio me referi à solução do Spring baseado em projeto da netflix, mas até mesmo um projeto usando nodejs. Porém, se a proposta dessas soluções como Amazon e IBM atenderem, que seja também.

O gateway seria uma espécie de barramento (não sei se esse termo se aplica 100% nesse caso). Mas o intuito dele é centralizar alguns aspectos dos microserviços, como segurança, log, etc. Todos os endpoints seriam acessados pelo gateway e então redirecionados para cada microserviço. Não deve possuir nenhuma lógica de negócio.

Confesso que ainda tenho algumas dúvidas em como fazer melhor nesse aspecto. Infelizmente, o que já vi até hoje é sim usar consultas N+1. Uma abordagem que já li a respeito é o CQRS, mas acredito que soh cabe usar num caso de extremo acesso (alta taxa de leitura e escrita).

Criado 22 de maio de 2020
Ultima resposta 25 de mai. de 2020
Respostas 6
Participantes 3