Os serviços devem conversar diretamente entre si em uma arquitetura de microsserviço?


10

Eu tenho vários serviços da web que formam um aplicativo da web. Os clientes podem acessar esses serviços por meio de chamadas das APIs REST.

Esses serviços devem poder conversar diretamente entre si? Em caso afirmativo, isso não os unirá, o que contraria o conceito de microsserviços?

O cliente deve chamá-los diretamente um após o outro para obter os dados necessários para carregar uma página da Web no cliente?

Ou devo ter outra camada em cima dos meus serviços, que lida com uma solicitação do cliente, busca os dados para essa solicitação e os envia de volta ao cliente?


Se as coisas estão completamente desacopladas, são produtos completamente separados. Para que o usuário tenha que fazer login no Logon da Contoso, o logon da Contoso dirá "Agora você está logado!" ... e depois eles vão para o Armazenamento de Dados Sensíveis da Contoso, marque a caixa que diz "Sim, estou logado "... copie e cole os dados disso no Contoso Data Processor ...
user253751

Respostas:


15

Se você deseja que seus serviços sejam exibidos nesta imagem, então sim: insira a descrição da imagem aqui não é como se você não pudesse fazê-lo, mas na maioria das vezes isso terá consequências ruins. A comunicação através do REST não dissociará significativamente seus serviços. Quando alguma interface de serviço é alterada, todos os serviços dependentes provavelmente precisam ser alterados e reimplantados. Além disso, durante a reimplantação do serviço, você precisará desativar todos os serviços dependentes, o que não é considerado um bom design para os padrões de alta disponibilidade.

No final, você terá um aplicativo de microsserviços mais lento do que o aplicativo monolito alternativo, mas com quase todos os mesmos problemas!

Eu tenho que discordar de @Robert Harvey

Na prática, no entanto, um ou mais dos seus microsserviços (talvez todos eles) conversarão com algum armazenamento de dados central como um banco de dados SQL.

O banco de dados de integração é antipadrão bem conhecido

Uma solução muito melhor é usar o padrão de publicação-assinatura para tornar a comunicação entre seus serviços assíncrona:

insira a descrição da imagem aqui

Por favor, dê uma olhada na maneira do CQRS / ES de implementar esse método de comunicação. Greg Young e outros caras oferecem vários vídeos interessantes sobre o assunto. Basta pesquisar no Google a palavra-chave "CQRS / ES". Nessa abordagem, cada serviço se tornará publicador e assinante ao mesmo tempo, permitindo que os serviços sejam muito menos acoplados.

Aqui está uma boa série de artigos sobre microsserviços que esclarecem a controvérsia em torno do tópico. Explicação muito detalhada com boas ilustrações.


2
Bem, antes de mais nada, nunca ouvi o termo "banco de dados de integração" em lugar algum, exceto Fowler. Não tome algo como evangelho só porque um cara disse isso. Segundo, você não tem informações suficientes para chamar o que descrevi de "banco de dados de integração". Terceiro, Fowler realmente chama esses bancos de dados de utilidade nas circunstâncias certas, no mesmo artigo que você vinculou. Gosto da ideia de um barramento de eventos, embora não veja como é tão diferente do que chamar a API usual do microsserviço, a menos que você possa aumentar a eficiência.
Robert Harvey

Obrigado Robert, vinculei o artigo de Fowler para melhor ilustrar a idéia, para não argumentar com autoridade. A maneira como você descreveu essa abordagem se parece muito com o banco de dados de integração 1. Se é diferente - isso não é óbvio. Com relação às circunstâncias corretas - acho que integrar microsserviços por meio de banco de dados não é uma boa ideia, pois nos leva de volta a uma arquitetura monolítica.
usar o seguinte comando

1
Claro: cada microsserviço conversará com seu próprio banco de dados separado ou com as tabelas no mesmo banco de dados que não estão relacionadas a tabelas de outros serviços. Dessa maneira, os serviços nunca trocam informações pelo banco de dados, o que significa que você pode facilmente escalar horizontalmente e haverá muito menos gargalos. E como eles não compartilham as mesmas tabelas - as alterações em uma parte do aplicativo terão menos probabilidade de influenciar outras partes.
precisa saber é o seguinte

1
Você não pode afirmar categoricamente isso como absoluto. Pode haver dois serviços que precisam das mesmas informações no mesmo banco de dados, eles apenas precisam ocasionalmente, não há problema de dimensionamento para acessá-lo dessa maneira, os dois serviços já estão acessando o banco de dados para outros fins, de qualquer maneira, então, levantando um barramento de serviço ou ponto final da API apenas para conseguir isso seria ridículo.
Robert Harvey

1
Mas, para obter valor comercial, você deseja combinar dados - "mostre-me todos os sistemas de esgoto que terão capacidade de armazenamento insuficiente, dados os seguintes dados de radar da chuva recebida e colore esse mapa de municípios usando o resultado". Se você dividir todos os seus dados em serviços, isso significa apenas que você pode combinar os dados apenas mais tarde. Se você proíbe que os serviços conversem entre si, basta forçar-se a mover todos os dados para algum cliente e juntar os dados lá. Você deseja acoplar dados em algum lugar, pois é isso que, no final, dá um valor ao aplicativo.
RemcoGerlich 10/01

8

Você terá muitas idéias muito boas lendo o que Udi Dahan tem a dizer sobre SOA .

Um serviço é a autoridade técnica para um recurso comercial específico. Qualquer dado ou regra deve pertencer a apenas um serviço.

O que isso significa é que, mesmo quando os serviços estão publicando e se inscrevendo nos eventos um do outro, sempre sabemos qual é a fonte autorizada da verdade para cada dado e regra.

Além disso, ao analisar os serviços sob as lentes dos recursos de negócios, o que vemos é que muitas interfaces de usuário apresentam informações pertencentes a diferentes recursos - o preço de um produto, ao lado de estar em estoque ou não. Para cumprirmos a definição de serviços acima, isso nos leva a entender que essas interfaces de usuário são realmente um mashup - com cada serviço tendo o fragmento da interface do usuário lidando com seus dados específicos.

Especificamente em relação à composição da interface do usuário, o artigo de Mauro Servienti sobre a composição da interface do usuário é um bom ponto de partida. Veja também o vídeo de Udi, disponível aqui .

Esses serviços devem poder conversar diretamente entre si? Em caso afirmativo, isso não os unirá, o que contraria o conceito de microsserviços?

Se dois serviços trocarem mensagens entre si, você obterá um acoplamento. A resposta principal é que eles associam à API do outro serviço - o contrato que o serviço promete manter estável, mesmo quando seus internos estão mudando.

Além disso, técnicas como a descoberta de serviços podem facilitar a dependência de um provedor de serviços específico, e os intermediários de mensagens podem dissociar os produtores e os consumidores (eles ainda precisam entender as mensagens uns dos outros e como interagir com a API do intermediário de mensagens - não há mágica )


7

Depende do que você quer dizer com "diretamente".

É perfeitamente bom, de acordo com a arquitetura dos microsserviços, ter microsserviços que invocam outros microsserviços, seja no seu próprio servidor ou mesmo em servidores externos, por meio de alguma interface como REST.

O que não é bom é que um microsserviço invoque outro usando invocações diretas de método; isso tornaria ambos os microsserviços parte do mesmo monólito.


não está bem e terá más consequências. Veja minha resposta para mais detalhes.
precisa saber é o seguinte

@IlliakaillI estou dizendo que está tudo bem "de acordo com a arquitetura de microsserviços". Não estou sugerindo que a arquitetura de microsserviços esteja livre de consequências ou que não haja melhorias que possam ser feitas nela. A questão aqui é "é X pelo livro, ou não?" e a resposta certa é que, dada a definição correta de X, é pelo livro.
Mike Nakis

Existe um "livro de referência" que informa como criar uma "arquitetura de microsserviços" real? Atualmente, os microsserviços estão se tornando um chavão e muitas pessoas escreveram livros sobre como construir monólitos sobre o REST. Basta olhar para o primeiro diagrama na minha resposta, não faz sentido criar sistema dessa maneira. Se você faz por algum motivo estranho - você definitivamente está fazendo errado. É melhor você ir com monólito. Se você apóia suas escolhas de design consultando cegamente alguns livros (argumentando com autoridade), não é a maneira correta de abordar o design de software.
precisa saber é o seguinte

5

Esses serviços devem poder conversar diretamente entre si? Em caso afirmativo, isso não os unirá, o que contraria o conceito de microsserviços?

Acoplamento não é uma palavra ruim. Toda aplicação já possui um certo grau de acoplamento; os aplicativos que falam com seus microsserviços estão acoplados aos microsserviços, caso contrário eles não funcionariam.

O que você realmente procura com microsserviços é o acoplamento solto ; você pode conseguir isso simplesmente fazendo com que um microsserviço interrogue o outro por meio de sua API pública ou usando um barramento de eventos.

Na prática, no entanto, um ou mais dos seus microsserviços (talvez todos) irão conversar com algum armazenamento de dados central, como um banco de dados SQL. Dependendo de como você deseja atingir seu objetivo, você pode simplesmente ter um microsserviço alterando os dados do banco de dados de alguma forma, que o outro microsserviço consultará para captar a alteração.


3
"Banco de dados de integração" é antipadrão conhecido, veja minha resposta para mais detalhes.
precisa saber é o seguinte

2

Parece que, ao falar sobre SOA e arquitetura em geral, as pessoas são pegas na semântica e no jargão. O que torna um serviço "micro"? Por fim, é um conjunto de características que, em qualquer "sistema de pontuação" que você estiver usando, claramente não torna o serviço "não micro". O que foi que o juiz da Suprema Corte disse sobre indecência? "Eu vou saber quando eu vir."

Tenho certeza de que algumas pessoas dirão que isso é uma não resposta, mas então elas estão perdendo o objetivo. As arquiteturas de microsserviço destinam-se a evitar vários problemas, entre eles a questão do "acoplamento rígido". Portanto, se você acabar criando um emaranhado de microsserviços que dependem de muitos detalhes finos um do outro, criou um acoplamento rígido que - seja usando um barramento de mensagens de pub / sub ou chamadas diretas - destrói sua capacidade de compor novas soluções a partir das peças, reconfigurar peças individuais sem derrubar todo o sistema, etc etc


1

O cliente deve chamá-los diretamente um após o outro para obter os dados necessários para carregar uma página da Web no cliente?

Depende; no entanto, sugiro fornecer recursos diretamente utilizáveis ​​ao cliente e ocultar (encapsular) os detalhes de como os resultados são reunidos (por exemplo, através de vários micro serviços).

Se houver muita lógica envolvida na combinação de resultados individuais de microsserviços pelo cliente, isso pode causar inadvertidamente alguma lógica de negócios que se infiltra no cliente. Também pode expor mais da sua arquitetura interna ao cliente do que você gostaria, dificultando a refatoração posterior dos microsserviços.

Portanto, com microsserviços, às vezes é útil ter um microsserviço de wrapper que forneça ao cliente um terminal com abstrações úteis e que execute uma coordenação de nível mais alto de outros microsserviços (talvez agora mais internos).


(Além disso, as viagens de ida e volta para o cliente provavelmente são mais caras do que dos microsserviços entre si.)


Se você observar a direção adotada pelo GraphQL, por exemplo, encontrará clientes emitindo consultas diretamente relevantes para um terminal, que pode ou não ser implementado como uma coleção de microsserviços. Como a arquitetura dos microsserviços fica oculta por trás do GraphQL, isso torna a arquitetura mais fácil de refatorar e também mais amigável para o cliente. Consulte, por exemplo, https://stackoverflow.com/a/38079681/471129 .


1

O principal objetivo dos microsserviços é tornar seu aplicativo fracamente acoplado. Portanto, os serviços não podem se chamar. Caso contrário, ele será amarrado. Mas o que faremos se tivermos dois serviços que precisam compartilhar dados? A resposta é Message Broker. Portanto, o serviço que obtém dados do cliente pode compartilhar os dados com o intermediário central de mensagens; então, os serviços precisam usar esses dados para consumi-los, transformá-los e colocá-los em seu próprio armazenamento de dados. Eu recomendo o Kafka porque você pode juntar dados de diferentes tópicos em tempo real com o Kafka Stream. PS. melhor separar seus microsserviços por recurso.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.