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
, Notification
e nós temos o seguinte fluxo de trabalho:
Ao criar uma nova reserva:
- Verifique se o usuário existente já tem uma reserva
- Obter lista de drivers disponíveis
- Enviar notificação aos motoristas para retirar a reserva
- 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 Booking
serviç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çõesBooking
- 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 Booking
serviç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 :-)
fonte
Respostas:
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
booking
enotification
. Você não precisa dodriver
serviço (para nenhuma das atividades que você descreveu).A obtenção de uma lista de drivers disponíveis para reserva se enquadra no
booking
serviç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
booking
có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:
booking
serviço para obter uma lista de drivers disponíveisbooking
serviçobooking
serviço de serviço chama onotification
serviço com os detalhes da reservanotification
serviço envia uma notificação ao motorista, notificando-o da reservanotification
serviço quando eles estão a uma milha do clientenotification
serviç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.
fonte
Tudo depende da sua exigência exata.
Digamos que você tenha dois aplicativos fazendo a 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)
fonte
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.
fonte