Conheça a Arquitetura de microsserviços orientada a domínio - DOMA

Conheça a Arquitetura de microsserviços orientada a domínio - DOMA

Imagine o cenário em que você está desenvolvendo uma aplicação corporativa, ela deve oferecer suporte a uma variedade de clientes diferentes, incluindo navegadores de desktop, navegadores móveis ou até comunicação em um aplicativo móvel. A aplicação também pode expor uma API para consumo de terceiros. Ela também pode se integrar a outras aplicações por meio de serviços da web ou por mensagens. A aplicação lida com solicitações (solicitações e mensagens HTTP) executando a lógica de negócios; acessa um banco de dados; troca mensagens com outros sistemas; e retorna uma resposta JSON / XML ou qualquer outro formato previamente conhecido. Existem também componentes lógicos correspondentes a diferentes áreas funcionais do aplicativo.

Leve também em consideração algumas premissas para este seu cenário corporativo:  

  • Há uma ou mais equipes de desenvolvedores trabalhando na aplicação
  • Novos membros da equipe devem se tornar produtivos rapidamente
  • A aplicação deve ser fácil de entender e modificar, ocasionando o mínimo de impacto em outras partes da aplicação
  • Você deseja praticar a implantação contínua (CD) da aplicação
  • Você deve atender aos requisitos de escalabilidade horizontal e disponibilidade da aplicação
  • Você quer aproveitar as vantagens das tecnologias emergentes (frameworks, linguagens de programação etc.)

Analisando o cenário e as premissas, temos ótimos indícios de que a arquitetura de microsserviços pode ser algo que se encaixe no seu negócio.

O que é um microsserviço para a Vórtx?


Assim aconteceu com a Vórtx, tínhamos alguns motivadores que nos indicavam que a arquitetura de microsserviços era mais benéfica do que maléfica para nós; sim, adotar este estilo arquitetural tem seus custos. Porém, depois de algum tempo, construímos nossas próprias premissas para viabilizar um microsserviço e, antes de falarmos do que é a DOMA em si, gostaria de compartilhar com você algumas dessas premissas:

• Têm limites bem definidos centrados no contexto de negócios, e não em abstrações técnicas arbitrárias
• Ocultam detalhes de implementação e expõem a funcionalidade por meio de interfaces com intenção explícita (rest ou graphql)
• Não compartilham suas estruturas internas. Ex: nenhum compartilhamento de bancos de dados.
• Buscam respeitar os 12 fatores para aplicações modernas
• Os serviços são resilientes a falhas - Teorema de CAP -  (Fallacies of distributed computing)
• Arquitetura fracamente acoplada, em que cada microsserviço é inserido em um contexto delimitado bem definido, permitindo a entrega rápida, frequente e confiável de funcionalidades.
• Ser construído baseado em DDD, Clean Architecture, e preferencialmente com Herbs

Partindo desses princípios, vimos que tínhamos uma certa noção e domínio sobre nosso estilo arquitetural, mas que somente esses princípios não eram totalmente suficientes quando olhávamos com o crescimento do negócio em si, o que de fato era o mais importante, construir software alinhado ao negócio. Foi aí que encontramos a DOMA - Domain-Oriented Microservice Architecture.

DOMA - Domain-Oriented Microservice Architecture.

A DOMA foi apresentada inicialmente pela Uber, como uma nova nomenclatura para denominar a prática de dividir os microsserviços de acordo com os seus domínios, criando uma nova segmentação do Domain-Driven Design (DDD)

Na Uber, foi adotada uma arquitetura de microsserviço porque tinham (por volta de 2012-2013) principalmente dois serviços monolíticos e eles se depararam com muitos dos problemas operacionais que os microsserviços resolvem:

  • Riscos de disponibilidade. Uma única regressão dentro de uma base de código monolítica pode derrubar todo o sistema (neste caso, todo o Uber).
  • Implantações arriscadas e caras. A execução deles era dolorosa e demorada, com a necessidade frequente de reversões.
  • Fraca separação de interesses. Era difícil manter boas separações de interesses com uma grande base de código. Em um ambiente de crescimento exponencial, a conveniência às vezes levou a limites inadequados entre a lógica e os componentes.
  • Execução ineficiente. Esses problemas combinados dificultavam a execução das equipes de forma autônoma ou independente.

Resumidamente, a “Domain-Oriented Architecture Microservice” desenha assim fortemente a partir de formas estabelecidas para organizar o código, como Domain-Driven Design , Arquitetura Limpa , Arquitetura Orientada a Serviços e padrões de design a objetos e orientada para a interface.

A Uber ainda diz: Pensamos no DOMA como inovador apenas na medida em que é uma maneira relativamente nova de alavancar os princípios de design estabelecidos em grandes sistemas distribuídos em grandes organizações.

Os princípios básicos e a terminologia associados ao DOMA são os seguintes:

  1. Em vez de orientar em torno de microsserviços baseados apenas em conceitos de responsabilidade única, o DOMA orienta em torno de coleções de microsserviços relacionados. Chamamos esses de domínios.
  2. Além disso, criamos coleções de domínios que chamamos de camadas. A camada à qual o domínio pertence estabelece quais dependências os microsserviços desse domínio podem assumir. Chamamos isso de design de camada.
  3. Fornecemos interfaces claras para domínios que tratamos como um único ponto de entrada na coleção. Chamamos esses de gateways.
  4. Finalmente, estabelecemos que cada domínio deve ser agnóstico a outros domínios, ou seja, um domínio não deve ter lógica relacionada a outro domínio embutida em sua base de código ou modelos de dados. Como frequentemente as equipes precisam incluir lógica no domínio de outra equipe (por exemplo, lógica de validação personalizada ou algum metacontexto em um modelo de dados), fornecemos uma arquitetura de extensão para suportar pontos de extensão bem definidos dentro do domínio.

De maneira objetiva, podemos dizer que ao seguir a DOMA, ela guiará a partir do domínio de negócio, se "X ou Y funcionalidades devem formar um microsserviço novo ou apenas novos endpoints dentro de algum microsserviço já existente".

Isto nos possibilita no âmbito de arquitetura de sistemas, desenhar em nível de negócio como todo o ecossistema de microsserviços funciona, representando assim com maior fidelidade o próprio reflexo de como a organização trabalha. Ainda sobre os princípios e terminologias do DOMA, vamos à uma breve explicação:

Layer Design

O design da camada responde a questão "qual serviço pode chamar qual outro serviço?" dentro da arquitetura de microsserviço orientada a domínio. Como resultado, podemos pensar no design da camada como uma "separação de interesses em escala".

O design de camada descreve um mecanismo para pensar sobre o a especificidade do produto nas dependências de serviço do negócio. À medida que os domínios passam da camada inferior para a superior, eles impactam menos serviços no caso de uma interrupção e representam casos de uso de produtos mais específicos. Por outro lado, a funcionalidade nas camadas inferiores tem mais dependentes e, como resultado, tendem a ter um impacto maior e representam um conjunto mais geral de funcionalidades de negócios. A figura abaixo ilustra esse conceito.

Pode-se pensar nas camadas superiores como experiências de usuário específicas (como recursos móveis) e nas camadas inferiores como funcionalidade generalizada de negócios (como gerenciamento de contas ou cadastro de usuários). As camadas dependem apenas das camadas abaixo delas, o que nos dá uma heurística útil para pensar sobre questões como fluxo, dependência e integração de domínio.

Benefícios do DOMA na Vórtx

Quase todos os domínios principais da Vórtx foram influenciados em algum nível pelo DOMA. Focamos principalmente na camada de negócios, que fornece uma lógica generalizada para cada uma de nossas várias linhas de negócios.

Anteriormente, as equipes de produto precisavam chamar vários serviços para alavancar um domínio; eles agora precisam chamar apenas um. Ao reduzir o número de pontos de contato para integrar um novo recurso, as plataformas foram capazes de reduzir o tempo de integração em 25-50%. Além disso, fomos capazes de classificar 60 microsserviços em pouco mais de 10 domínios.

Aproximadamente 50% foram implementados, e a grande maioria deles tem algum plano para adoção futura, pois eles estão completamente alinhados aos planos futuros do próprio negócio. Nenhum microsserviço de domínio nasce "do nada" ou sem algum motivador forte de negócio, pois toda a arquitetura reflete o negócio por si só. Se tivéssemos que apresentar a Vórtx para alguém em nível de negócio,  talvez apresentar o próprio diagrama de serviços fosse o suficiente.

Considerações finais

De maneira alguma, a Vórtx adotou a DOMA simplesmente porque a Uber criou, na verdade, já estávamos fazendo a modelagem orientada a domínios e encontrar um case como o da Uber nos deu ainda mais certeza de que estávamos de certa forma "não reinventando a roda". Ainda estamos desenvolvendo e adaptando ativamente a DOMA à medida que mais e mais equipes a adotam. O insight crítico do DOMA é que uma arquitetura de microsserviço é realmente apenas um programa grande e distribuído e você pode aplicar à sua evolução os mesmos princípios que aplicaria a qualquer parte do software. DOMA é simplesmente uma abordagem para pensar sobre esses princípios na prática.