Onde deve estar a lógica de negócios na arquitetura de microsserviço?

11

Ainda estou tentando entender a arquitetura de microsserviços, já que estou acostumada a uma abordagem monolítica

Suponha que tentemos criar um sistema de reservas Uber extremamente simplificado . Para simplificar as coisas que nós vamos dizer que temos 3 serviços e um gateway de API para o cliente: Booking, Drivers, Notificatione nós temos o seguinte fluxo de trabalho:

Ao criar uma nova reserva:

  1. Verifique se o usuário existente já tem uma reserva
  2. Obter lista de drivers disponíveis
  3. Enviar notificação aos motoristas para retirar a reserva
  4. Motorista pega a reserva

Digamos que todas as mensagens sejam feitas por meio de uma chamada http em vez de um barramento de mensagens como o kafka para simplificar as coisas.

Portanto, nesse caso, achei que o Bookingserviço pode fazer a verificação da reserva existente. Mas quem deve estar recebendo a lista de drivers e notificações disponíveis? Estou pensando em fazê-lo no nível do gateway, mas agora a lógica está dividida em dois lugares:

  • Gateway - obtenha lista de drivers disponíveis + envie notificações
  • Booking - verifique a reserva existente

E tenho certeza de que o gateway não é o lugar certo para fazê-lo, mas sinto que, se estamos fazendo isso no Bookingserviço, está se tornando fortemente associado?

Para torná-lo mais complicado, o que acontece se tivermos outro projeto que deseja reutilizar o sistema de reservas, mas com sua própria lógica de negócios? Foi por isso que pensei em fazê-lo no nível do gateway, para que o novo gateway do projeto possa ter sua própria lógica de negócios separada da existente.

Outra maneira de fazer isso, suponho, é que cada projeto tenha seu próprio serviço de reservas, que conversará com o serviço principal de reservas, mas não tenho certeza de qual é a melhor abordagem aqui :-)

GantengX
fonte
2
É realmente difícil responder sem todo o contexto. E mesmo sabendo disso, iniciar um projeto que divulgue a lógica de negócios em microsserviços nem sempre é uma boa idéia e é por isso que algumas pessoas adotam o "Monolith First", porque no começo você realmente não conhece as responsabilidades de cada parte do sua aplicação. Isso fica claro apenas mais tarde.
Dherik 11/01/19

Respostas:

12

As pessoas costumam ouvir "micro-serviço" e pensar em "nano-serviço", e isso pode causar alguma confusão. Estes são microsserviços , portanto você não precisa de um serviço separado para cada entidade. Tudo o que você está tentando fazer deve estar nos serviços bookinge notification. Você não precisa do driverserviço (para nenhuma das atividades que você descreveu).

A obtenção de uma lista de drivers disponíveis para reserva se enquadra no bookingserviço. Uma armadilha comum é não agrupar atividades relacionadas no mesmo serviço, isso é chamado de baixa coerência e é muito ruim. Lembre-se de agrupar as coisas em um serviço por domínio do problema, não por entidade.

Agora, quanto à reutilização, a vantagem de ter um microsserviço separado é que agora você pode ter três equipes separadas, fazendo o consumidor enfrentar aplicativos. Uma equipe para o aplicativo da web html padrão, um aplicativo para Android e um aplicativo iOS. Todos esses aplicativos diferentes podem ser criados de maneira completamente diferente e parecem adequados para sua plataforma específica (sem repetir o código). O bookingcódigo de serviço é reutilizado por todos esses três aplicativos, porque os três fazem chamadas http para o serviço, em vez de ter seu próprio código de reserva.

Um fluxo de reserva típico ficaria assim:

  1. O aplicativo Android chama o bookingserviço para obter uma lista de drivers disponíveis
  2. O serviço de reserva retorna uma lista de drivers para o aplicativo
  3. O usuário seleciona o driver e o aplicativo chama o método "book" do bookingserviço
  4. O bookingserviço de serviço chama o notificationserviço com os detalhes da reserva
  5. O notificationserviço envia uma notificação ao motorista, notificando-o da reserva
  6. O aplicativo de driver envia uma mensagem para o notificationserviço quando eles estão a uma milha do cliente
  7. O notificationserviço envia o alerta ao cliente de que o motorista está quase lá

Espero que isso tenha ajudado; lembre-se, eles são microsserviços, não nanosserviços, não tente dividir o mesmo domínio do problema. Portanto, para responder ao título da sua pergunta, quando você mantiver um microsserviço do tamanho adequado, toda ou a maior parte da lógica de negócios para esse domínio de problema poderá residir nesse microsserviço.

TheCatWhisperer
fonte
1

Tudo depende da sua exigência exata.

Digamos que você tenha dois aplicativos fazendo a reserva:

  1. Primeiro caso: um aplicativo pode permitir que um usuário reserve várias vezes, o outro permite apenas um. Isso significa que a restrição da reserva está no nível do aplicativo, portanto, você tem dois pontos de entrada no seu sistema de reservas (um que permite a multilocação, outro que não) ou você apenas verifica isso nos microsserviços relevantes inscrição.
  2. Segundo caso: faz parte da definição de "Reserva" que um usuário não pode ter vários, independentemente da aplicação, esta regra é verdadeira para todo o sistema: isso significa que você pode colocar o cheque no microsserviço de reserva.

Quanto ao sistema de notificações, você pode ter microsserviços inscrevendo-se no seu serviço de reservas para ouvir qualquer nova reserva. Como tal, o microsserviço de reserva notificará todos os assinantes e eles agirão de acordo.

O único problema nesse tipo de arquitetura é o que acontece se algo falhar após a publicação da notificação, uma vez que os dois microsserviços não funcionam como duas funções executadas na mesma transação do banco de dados, você precisará lidar com os erros normalmente e, eventualmente, reproduzir os processos que falharam (automática ou manualmente)

Walfrat
fonte
0

A resposta simples é que os clientes dos microsserviços são os que gerenciam a lógica de negócios em uma arquitetura de microsserviços 'pura'. Para facilitar o entendimento, considere um exemplo ainda mais simples. Um serviço que apenas retorna fluxos de bytes com base em um URI. Por si só, não é muito útil. Sem saber de alguma maneira quais URIs têm o que há nelas, você só pode adivinhar onde puxar as coisas. Agora, suponha que você tenha um microsserviço diferente que ofereça um recurso de pesquisa. Você envia uma solicitação com uma string de consulta e ela retorna URIs. Agora as coisas ficam mais interessantes. Eu posso colocar referências a URIs para o primeiro serviço em um índice.

Mas ainda assim, precisamos coordenar de alguma forma entre esses dois. Há uma resposta simples: você usa um navegador para recuperar URIs do serviço de indexação e depois recuperar os dados do serviço de dados. Nenhum dos serviços 'conhece' o outro e não há absolutamente nenhum acoplamento entre eles. Eu posso usar o serviço de indexação com qualquer outro serviço de dados e vice-versa.

Não é necessariamente o caso de que essa é a melhor abordagem em todos os cenários, mas há muitos benefícios em criar as coisas dessa maneira, especialmente a reutilização em cenários que atualmente não são conhecidos.

JimmyJames
fonte