Orquestrando microsserviços

200

Qual é o padrão de orquestração de microsserviços?

Se um microsserviço conhece apenas seu próprio domínio, mas há um fluxo de dados que exige que vários serviços interajam de alguma maneira, qual o caminho a seguir?

Digamos que temos algo parecido com isto:

  • Faturamento
  • envio

E para o argumento, digamos que, uma vez que um pedido tenha sido enviado, a fatura deve ser criada.

Em algum lugar, alguém pressiona um botão em GUI"Eu terminei, vamos fazer isso!" Em uma arquitetura clássica de serviço monolítico, eu diria que existe uma ESBsolução para isso, ou o serviço de Remessa tem conhecimento do serviço de fatura e apenas chama isso.

Mas como é que as pessoas lidam com isso neste admirável mundo novo de microsserviços?

Entendo que isso possa ser considerado altamente baseado em opiniões. mas há um lado concreto, pois os microsserviços não devem fazer o acima. Portanto, deve haver um "o que deveria, por definição, fazer", que não é baseado em opiniões.

Atire.

Roger Johansson
fonte

Respostas:

316

Microsserviços para construção de livros descreve em detalhes os estilos mencionados por @RogerAlsing em sua resposta.

Na página 43 em Orquestração vs Coreografia, o livro diz:

Quando começamos a modelar lógicas cada vez mais complexas, precisamos lidar com o problema de gerenciar processos de negócios que se estendem além dos limites de serviços individuais. E com microsserviços, atingiremos esse limite mais cedo do que o habitual. [...] Quando se trata de realmente implementar esse fluxo, existem dois estilos de arquitetura que poderíamos seguir. Com a orquestração, contamos com um cérebro central para orientar e conduzir o processo, como o maestro de uma orquestra. Com a coreografia, informamos cada parte do sistema de seu trabalho e deixamos que ele elabore os detalhes, como dançarinos, todos descobrindo seu caminho e reagindo aos outros ao seu redor em um balé.

O livro passa a explicar os dois estilos. O estilo de orquestração corresponde mais à idéia SOA de serviços de orquestração / tarefa , enquanto o estilo de coreografia corresponde aos tubos burros e pontos de extremidade inteligentes mencionados no artigo de Martin Fowler.

Estilo de orquestração

Sob esse estilo, o livro acima menciona:

Vamos pensar em como seria uma solução de orquestração para esse fluxo. Aqui, provavelmente a coisa mais simples a fazer seria fazer com que nosso serviço ao cliente atue como o cérebro central. Na criação, ele conversa com o banco de pontos de fidelidade, serviço de e-mail e serviço postal, [...] por meio de uma série de chamadas de solicitação / resposta. O próprio serviço ao cliente pode rastrear onde um cliente está nesse processo. Ele pode verificar se a conta do cliente foi configurada ou se o email foi enviado ou a postagem foi entregue. Podemos pegar o fluxograma e [...] modelá-lo diretamente no código. Poderíamos até usar ferramentas que implementam isso para nós, talvez usando um mecanismo de regras apropriado. Existem ferramentas comerciais para esse fim, na forma de software de modelagem de processos de negócios. Supondo que usamos solicitação / resposta síncrona, poderíamos até saber se cada estágio funcionou [...] A desvantagem dessa abordagem de orquestração é que o serviço ao cliente pode se tornar uma autoridade governamental central demais. Pode se tornar o centro no meio de uma rede e um ponto central em que a lógica começa a viver. Eu já vi essa abordagem resultar em um pequeno número de serviços "divinos" inteligentes, dizendo aos serviços anêmicos baseados em CRUD o que fazer.

Nota: Suponho que, quando o autor menciona ferramentas, ele está se referindo a algo como BPM (por exemplo , Activity , Apache ODE , Camunda ). De fato, o site de padrões de fluxo de trabalho possui um conjunto impressionante de padrões para fazer esse tipo de orquestração e também oferece detalhes de avaliação de diferentes ferramentas de fornecedores que ajudam a implementá-lo dessa maneira. Eu não acho que o autor implique que seja necessário usar uma dessas ferramentas para implementar esse estilo de integração, embora outras estruturas leves de orquestração possam ser usadas, por exemplo, Spring Integration , Apache Camel ou Mule ESB

No entanto, outros livros que li sobre o microsserviços e, em geral, a maioria dos artigos encontrados na Web parecem desfavorecer essa abordagem da orquestração e, em vez disso, sugerem o uso da próxima.

Estilo coreográfico

No estilo coreográfico, o autor diz:

Com uma abordagem coreografada, poderíamos apenas fazer com que o serviço ao cliente emitisse um evento de maneira assíncrona, dizendo que o cliente foi criado. O serviço de e-mail, o serviço postal e o banco de pontos de fidelidade apenas assinam esses eventos e reagem de acordo [...] com essa abordagem. Se algum outro serviço precisou chegar à criação de um cliente, ele só precisa se inscrever nos eventos e fazer seu trabalho quando necessário. A desvantagem é que a visão explícita do processo de negócios que vemos no [fluxo de trabalho] agora é refletida apenas implicitamente em nosso sistema. Isso significa [...] que trabalho adicional é necessário para garantir que você possa monitorar e rastrear as coisas certas. aconteceu. Por exemplo, você saberia se o banco de pontos de fidelidade tinha um bug e, por algum motivo, não configurou a conta correta? Uma abordagem que eu gosto de lidar com isso é criar um sistema de monitoramento que corresponda explicitamente à exibição do processo de negócios no [fluxo de trabalho], mas depois rastreie o que cada um dos serviços faz como entidades independentes, permitindo que você veja exceções estranhas mapeadas no fluxo de processo mais explícito. O fluxograma não é a força motriz, mas apenas uma lente através da qual podemos ver como o sistema está se comportando. Em geral, eu descobri que os sistemas que tendem mais para a abordagem coreografada são mais fracamente acoplados e são mais flexíveis e propensos a mudanças. Você precisa fazer um trabalho extra para monitorar e rastrear os processos através dos limites do sistema. Eu achei as implementações mais fortemente orquestradas extremamente frágeis, com um custo de mudança mais alto. Com isso em mente, prefiro fortemente apontar para um sistema coreografado, em que cada serviço seja inteligente o suficiente para entender seu papel em toda a dança.

Nota: Até hoje ainda não tenho certeza se a coreografia é apenas outro nome para a arquitetura orientada a eventos (EDA), mas se a EDA é apenas uma maneira de fazer isso, quais são as outras maneiras? (Veja também O que você quer dizer com "Orientado a Eventos"? E Os significados da arquitetura orientada a eventos ). Além disso, parece que coisas como CQRS e EventSourcing ressoam muito com esse estilo arquitetônico, certo?

Agora, depois disso, vem a diversão. O livro Microsserviços não assume que os microsserviços serão implementados com o REST. De fato, na próxima seção do livro, eles passam a considerar as soluções baseadas em RPC e SOA e, finalmente, o REST. Um ponto importante aqui é que os microsserviços não implicam REST.

Então, e quanto a HATEOAS? (Hipermídia como o mecanismo do estado do aplicativo)

Agora, se queremos seguir a abordagem RESTful, não podemos ignorar o HATEOAS ou Roy Fielding ficará muito satisfeito em dizer em seu blog que nossa solução não é verdadeiramente REST. Veja a publicação no blog dele na API REST deve ser direcionada por hipertexto :

Estou ficando frustrado com o número de pessoas que chamam qualquer interface baseada em HTTP de API REST. O que precisa ser feito para tornar claro o estilo de arquitetura REST na noção de que o hipertexto é uma restrição? Em outras palavras, se o mecanismo do estado do aplicativo (e, portanto, a API) não estiver sendo conduzido por hipertexto, ele não poderá ser RESTful e não poderá ser uma API REST. Período. Existe algum manual quebrado em algum lugar que precise ser corrigido?

Portanto, como você pode ver, Fielding acha que sem o HATEOAS você não está realmente construindo aplicativos RESTful. Para Fielding, o HATEOAS é o caminho a seguir quando se trata de orquestrar serviços. Estou apenas aprendendo tudo isso, mas para mim, o HATEOAS não define claramente quem ou o que é a força motriz por trás dos links. Em uma interface do usuário que pode ser o usuário, mas nas interações computador a computador, suponho que isso precise ser feito por um serviço de nível superior.

Segundo o HATEOAS, o único link que o consumidor da API realmente precisa saber é o que inicia a comunicação com o servidor (por exemplo, POST / pedido). A partir deste momento, o REST conduzirá o fluxo, porque, na resposta desse terminal, o recurso retornado conterá os links para os próximos estados possíveis. O consumidor da API decide o link a seguir e move o aplicativo para o próximo estado.

Apesar de parecer legal, o cliente ainda precisa saber se o link deve ser POSTADO, COLOCADO, OBTIDO, PATCHADO etc. O cliente ainda precisa decidir qual carga útil deve passar. O cliente ainda precisa estar ciente do que fazer se isso falhar (tente novamente, compense, cancele etc.).

Eu sou bastante novo nisso tudo, mas para mim, da perspectiva do HATEOAs, esse cliente ou consumidor de API é um serviço de alto nível. Se pensarmos da perspectiva de um ser humano, você pode imaginar um usuário final em uma página da web, decidindo quais links seguir, mas ainda assim, o programador da página da web precisou decidir qual método usar para chamar os links, e qual carga útil passar. Portanto, no meu ponto de vista, em uma interação computador a computador, o computador assume o papel de usuário final. Mais uma vez, é isso que chamamos de serviço de orquestração.

Suponho que podemos usar o HATEOAS com orquestração ou coreografia.

O padrão de gateway da API

Outro padrão interessante é sugerido por Chris Richardson, que também propôs o que chamou de Padrão de Gateway de API .

Em uma arquitetura monolítica, os clientes do aplicativo, como navegadores da web e aplicativos nativos, fazem solicitações HTTP por meio de um balanceador de carga para uma das N instâncias idênticas do aplicativo. Mas em uma arquitetura de microsserviço, o monólito foi substituído por uma coleção de serviços. Consequentemente, uma questão chave que precisamos responder é com o que os clientes interagem?

Um cliente de aplicativo, como um aplicativo móvel nativo, pode fazer solicitações HTTP RESTful para os serviços [...] individuais Na superfície, isso pode parecer atraente. No entanto, é provável que haja uma incompatibilidade significativa na granularidade entre as APIs dos serviços individuais e os dados exigidos pelos clientes. Por exemplo, exibir uma página da web pode exigir chamadas para um grande número de serviços. Amazon.com, por exemplo, descreve como algumas páginas requerem chamadas para mais de 100 serviços. Fazer muitas solicitações, mesmo em uma conexão de Internet de alta velocidade, sem falar em uma rede móvel de baixa largura de banda e latência mais alta, seria muito ineficiente e resultaria em uma experiência ruim para o usuário.

Uma abordagem muito melhor é que os clientes façam um pequeno número de solicitações por página, talvez apenas uma, na Internet, para um servidor front-end conhecido como gateway de API.

O gateway da API fica entre os clientes do aplicativo e os microsserviços. Ele fornece APIs personalizadas para o cliente. O gateway da API fornece uma API de granulação grossa para clientes móveis e uma API de granularidade mais fina para clientes de desktop que usam uma rede de alto desempenho. Neste exemplo, os clientes de desktop fazem várias solicitações para recuperar informações sobre um produto, enquanto um cliente móvel faz uma única solicitação.

O gateway da API lida com as solicitações recebidas, fazendo solicitações para um certo número de microsserviços na LAN de alto desempenho. A Netflix, por exemplo, descreve como cada solicitação atende, em média, seis serviços de back-end. Neste exemplo, solicitações de baixa granularidade de um cliente de desktop são simplesmente enviadas para o serviço correspondente, enquanto cada solicitação de baixa granularidade de um cliente móvel é tratada agregando os resultados da chamada de vários serviços.

O gateway da API não apenas otimiza a comunicação entre os clientes e o aplicativo, mas também encapsula os detalhes dos microsserviços. Isso permite que os microsserviços evoluam sem afetar os clientes. Por exemplo, dois microsserviços podem ser mesclados. Outro microsserviço pode ser particionado em dois ou mais serviços. Somente o gateway da API precisa ser atualizado para refletir essas alterações. Os clientes não são afetados.

Agora que examinamos como o gateway da API medeia entre o aplicativo e seus clientes, agora vamos ver como implementar a comunicação entre microsserviços.

Isso soa muito semelhante ao estilo de orquestração mencionado acima, apenas com uma intenção ligeiramente diferente; neste caso, parece ser tudo sobre desempenho e simplificação de interações.

Edwin Dalorzo
fonte
15
Boa resposta! Uma pergunta: se eu combinar microsserviços no estilo coreografia com um API-Gateway, o API-Gateway não se tornará a autoridade de governo central que você descreve como a desvantagem dos microsserviços no estilo da orquestração? Ou, em outras palavras, onde exatamente está a diferença entre "Estilo de orquestração" e Padrão de gateway de API?
Fritz Duchardt
4
@FritzDuchardt não exatamente. Embora o api-gateway se torne um ponto único de falha, não é necessariamente uma autoridade governamental de qualquer tipo. Um gateway API muito simples pode autenticar solicitações e proxy-las ao serviço de destino. O padrão api-gateway é principalmente para simplificar as interações cliente-back-end por meio de um único serviço, não resolve diretamente o problema de orquestrar ou coreografar os serviços aos quais o gateway de API procura (que é um serviço).
Porlune
Ótima resposta! Apenas uma pergunta sobre os gateways de API: O GraphQL é o gateway de API da próxima geração e pode muito bem substituir os gateways de API?
Kenneho
Estou tentando entender isso de uma visão prática. A coreografia é mais fracamente acoplada -> nesse caso, um eventListener deve ser adicionado dinamicamente ao método api? Caso contrário, se não cada método api sempre reagir a um evento recebeu (-> e, portanto, não é baixo acoplamento)
Vincent
Não concordo que a coreografia seja mais fracamente acoplada e, portanto, a orquestração precise ser evitada com microsserviços. Eu falei sobre isso, por exemplo, em berndruecker.io/complex-event-flows-in-distributed-systems . Você precisa de uma abordagem mais equilibrada em sua arquitetura.
Bernd Ruecker 6/04
35

Tentando agregar as diferentes abordagens aqui.

Eventos de domínio

A abordagem dominante para isso parece estar usando eventos de domínio, onde cada serviço publica eventos sobre o que aconteceu e outros serviços podem se inscrever nesses eventos. Isso parece andar de mãos dadas com o conceito de terminais inteligentes, tubos burros descritos por Martin Fowler aqui: http://martinfowler.com/articles/microservices.html#SmartEndpointsAndDumbPipes

Eventos de domínio

Proxy

Outra abordagem que parece comum é agrupar o fluxo de negócios em seu próprio serviço. Onde o proxy orquestra a interação entre os microsserviços, como mostrado na figura abaixo:

Proxies.

Outros padrões da composição

Esta página contém vários padrões de composição.

Roger Johansson
fonte
Aqui está um vídeo agradável quais são os outros padrões e como você pode combiná-los youtu.be/tSN1gOVQfPs?t=35m35s Sugerir adicioná-los a sua resposta
Grygoriy Gonchar
Nic images @Roger, qual ferramenta você estava usando?
Selvakumar Esra
1
@SelvakumarEsra draw.io
Roger Johansson
7

Então, como a orquestração de microsserviços é diferente da orquestração de serviços SOA antigos que não são "micro"? Não muito.

Os microsserviços geralmente se comunicam usando http (REST) ​​ou mensagens / eventos. A orquestração é frequentemente associada a plataformas de orquestração que permitem criar uma interação com script entre serviços para automatizar fluxos de trabalho. Nos velhos tempos da SOA, essas plataformas usavam o WS-BPEL. As ferramentas de hoje não usam BPEL. Exemplos de produtos modernos de orquestração: Netflix Conductor, Camunda, Zeebe, Aplicativos de lógica do Azure, Baker.

Lembre-se de que a orquestração é um padrão composto que oferece vários recursos para criar composições complexas de serviços. Os microsserviços são mais frequentemente vistos como serviços que não devem participar de composições complexas e, sim, mais autônomos.

Vejo um microsserviço sendo chamado em um fluxo de trabalho orquestrado para executar um processamento simples, mas não vejo um microsserviço como o serviço do orquestrador, que geralmente usa mecanismos como transações de compensação e repositório de estados (desidratação).

Paulo Merson
fonte
deve-se notar que as "ferramentas de hoje" em sua postagem ainda fazem uso de eventos, dados e atividades de alguma forma para "modelar" um fluxo - a camunda usa o BPMN, que é próximo ao BPEL, e os outros simplesmente definiram seu próprio DSL para representar um conceito semelhante.
Hightower
5

Então você está tendo dois serviços:

  1. Micro serviço de fatura
  2. Micro serviço de remessa

Na vida real, você teria algo em que mantém o estado da ordem. Vamos chamar de serviço de pedidos. Em seguida, você tem casos de uso de processamento de pedidos, que sabem o que fazer quando o pedido passa de um estado para outro. Todos esses serviços contêm um determinado conjunto de dados e agora você precisa de outra coisa que faça toda a coordenação. Pode ser:

  • Uma GUI simples, conhecendo todos os seus serviços e implementando os casos de uso ("pronto" chama o serviço de remessa)
  • Um mecanismo de processo de negócios, que aguarda um evento "Concluído". Esse mecanismo implementa os casos de uso e o fluxo.
  • Um microsserviço de orquestração, digamos que o próprio serviço de processamento de pedidos que conhece os casos de fluxo / uso do seu domínio
  • Mais alguma coisa em que ainda não pensei

O ponto principal disso é que o controle é externo. Isso ocorre porque todos os componentes do seu aplicativo são blocos de construção individuais, pouco acoplados. Se seus casos de uso mudarem, você deverá alterar um componente em um local, que é o componente de orquestração. Se você adicionar um fluxo de pedidos diferente, poderá adicionar facilmente outro orquestrador que não interfira no primeiro. O pensamento de microsserviços não é apenas sobre escalabilidade e execução de APIs REST sofisticadas, mas também sobre uma estrutura clara, dependências reduzidas entre componentes e reutilização de dados e funcionalidades comuns compartilhados por toda a empresa.

Mark HTH

mp911de
fonte
1

Se o Estado precisar ser gerenciado, o Event Sourcing with CQRS é a maneira ideal de comunicação. Senão, um sistema de mensagens assíncronas (AMQP) pode ser usado para comunicação entre microsserviços.

Com sua pergunta, fica claro que o ES com CQRS deve ser a combinação certa. Se estiver usando java, dê uma olhada na estrutura do Axon. Ou crie uma solução personalizada usando Kafka ou RabbitMQ.

Rajeesh Koroth
fonte
-2

Eu escrevi alguns posts sobre este tópico:

Talvez essas postagens também possam ajudar:

Padrão do API Gateway - API granularizada versus API granularizada

https://www.linkedin.com/pulse/api-gateway-pattern-ronen-hamias/ https://www.linkedin.com/pulse/successfulapi-ronen-hamias/

API de serviço de granularidade grossa x fina

Por definição, uma operação de serviço de granulação grossa tem escopo mais amplo que um serviço de granulação fina, embora os termos sejam relativos. maior complexidade de design de granulação grossa, mas pode reduzir o número de chamadas necessárias para concluir uma tarefa. na arquitetura de microsserviços, a granulação grossa pode residir na camada API Gateway e orquestrar vários microsserviços para concluir uma operação comercial específica. As APIs de granulação grossa precisam ser cuidadosamente projetadas, pois envolvem vários microsserviços que, ao gerenciar diferentes domínios de especialização, correm o risco de misturar preocupações em uma única API e violar as regras descritas acima. APIs de granulação grossa podem sugerir novo nível de granularidade para funções de negócios que, caso contrário, não existiriam. por exemplo, contratar funcionário pode envolver duas chamadas de microsserviços ao sistema de RH para criar o ID do funcionário e outra chamada ao sistema LDAP para criar uma conta de usuário. alternativamente, o cliente pode ter realizado duas chamadas de API refinadas para realizar a mesma tarefa. enquanto granularidade grossa representa uma conta de usuário de criação de caso de uso de negócios, a API granularizada representa os recursos envolvidos nessa tarefa. uma API ainda mais refinada pode envolver diferentes tecnologias e protocolos de comunicação, enquanto a granulada grossa os abstrai em fluxo unificado. ao projetar um sistema, considere ambos novamente, não existe uma abordagem de ouro que resolva tudo e existe uma troca para cada um. A granulação grossa é particularmente adequada como serviços a serem consumidos em outros contextos comerciais, como outros aplicativos,

Ronen
fonte
-2

a resposta para a pergunta original é o padrão SAGA.

Harold Vera
fonte
4
Gostaria de expandir sua resposta?
Patrick Mevzek
O Saga tenta imitar transações, para cada operação que você fornece uma operação de desfazer. Se uma cadeia de operações falhar, as operações de desfazer serão invocadas desde a origem.
sschrass
Parece uma resposta aleatória. A elaboração necessária.
bharatesh 24/03