Projeto - Monolítico, Monolítico Modular e Microsserviços


 Neste artigo vamos apresentar as arquiteturas Monolíto, Monolíto Modular e Microsserviços e vamos fazer uma comparação resumindo entre elas.
 
Vamos iniciar com a definição de cada uma das arquiteturas apresentadas iniciando com o Monolíto.

Monolíto

Um monolito é uma arquitetura de software em que todos os componentes e funcionalidades da aplicação são desenvolvidos, implementados e gerenciados como um único código-base e uma única aplicação. Geralmente, consiste em uma única unidade de execução, compartilhando o mesmo processo e banco de dados.

Uma arquitetura monolítica representa o modelo unificado convencional empregado no projeto de programas de software. Neste contexto, “monolítico” denota a integração de todos os componentes numa entidade única e coesa. O software monolítico é criado para ser independente, com seus elementos de programa intrinsecamente interconectados e interdependentes, em contraste com a natureza fracamente acoplada dos componentes em programas de software modulares.

Vantagens:

  1. Simplicidade: É mais fácil de desenvolver e manter, já que todas as partes da aplicação estão em um único código-base.
  2. Menor Complexidade Operacional: Implantação e operação são mais simples em comparação com arquiteturas distribuídas.
  3. Facilidade de Teste e Depuração: Testar e depurar um monolito geralmente é mais direto, pois tudo está em um único contexto.

A implementação de uma arquitetura monolítica é simples, esta abordagem permite um rápido progresso inicial, permitindo que as equipes apresentem rapidamente seus produtos aos clientes.

Manter toda a base de código em um único repositório e implantar o aplicativo em um local oferece vários benefícios. Um repositório unificado facilita a pesquisa e recuperação de todas as funcionalidades em uma pasta. Essa consolidação agiliza os pipelines de teste e implantação, reduzindo a sobrecarga, especialmente para aplicativos complexos.

O gerenciamento de um único conjunto de infraestrutura simplifica o processo de implantação, pois componentes adicionais aumentam os esforços de manutenção e possíveis pontos de falha.

Com a implantação monolítica, os dados residem em um banco de dados compartilhado, simplificando a recuperação por meio de consultas diretas ao banco de dados. Ao contrário dos serviços distribuídos, as arquiteturas monolíticas permitem a comunicação direta entre componentes, eliminando preocupações com versões de API, compatibilidade com versões anteriores e potencial latência em chamadas.

Desvantagens:

  1. Dificuldade de Escalabilidade: Escalar monolitos pode ser desafiador, pois você precisa replicar toda a aplicação, mesmo que apenas uma parte dela esteja sobrecarregada.
  2. Acoplamento Forte: Mudanças em uma parte do monolito podem afetar outras partes, o que pode dificultar a evolução independente de componentes.
  3. Manutenção Complexa: Conforme a aplicação cresce, a manutenção e a adição de novos recursos podem se tornar mais complexas.

Com o tempo, à medida que os aplicativos ou as equipes de desenvolvimento aumentam, as arquiteturas monolíticas se tornarão limitantes, aumentando os desafios na construção e no teste de novos recursos. O alto acoplamento e a falta de limites levaram à fragilidade, onde alterações de código aparentemente inocentes desencadearam repercussões inesperadas, causando falhas de testes não relacionadas.

O desenvolvimento em um sistema monolítico exige amplo entendimento contextual, dificultando a integração de novos membros da equipe. A natureza interconectada da base de código exige que os desenvolvedores compreendam vários aspectos além de seu domínio específico, resultando em uma curva de aprendizado acentuada e impedindo o desenvolvimento eficaz de recursos. Os problemas identificados estavam diretamente ligados a limites insuficientes entre funcionalidades distintas na base de código.

Monolíto Modular

O monolito modular é uma extensão da arquitetura monolítica, onde a aplicação é dividida em módulos ou componentes lógicos distintos.

Cada módulo pode ser desenvolvido, testado e mantido de forma mais independente, proporcionando uma maior organização e reutilização de código. Apesar de ainda residir em um único código-base, a modularização permite uma melhor divisão de responsabilidades.

Um Monólito Modular é uma estratégia de design de software em que um monólito é criado com foco em módulos intercambiáveis, cada um com potencial de reutilização. A arquitetura modular monolítica envolve inicialmente particionar nossa lógica em módulos independentes e isolados.

Cada módulo é projetado para ter sua própria lógica de negócios e, se necessário, seu banco de dados ou esquema. Esta abordagem permite a construção e modificação de camadas de módulos individuais sem impactar outras. Dentro da arquitetura Modular Monolith, continuamos a construir e implantar um aplicativo unificado, semelhante à arquitetura Monolith tradicional.

Vantagens:

  1. Decomposição Lógica: Permite dividir a aplicação em módulos, facilitando a compreensão e manutenção do código.
  2. Melhor Escalabilidade: É mais fácil escalar partes específicas da aplicação, pois os módulos podem ser tratados de maneira independente.
  3. Reaproveitamento de Código: Módulos podem ser reutilizados em diferentes partes da aplicação.

Desvantagens:

  1. Complexidade Adicional: A introdução de módulos adiciona complexidade ao projeto, tanto em termos de arquitetura quanto de implementação.
  2. Potencial para Acoplamento: Se não for bem projetado, ainda pode haver um nível significativo de acoplamento entre módulos.
  3. Limitações tecnológicas :  Os monólitos modulares não oferecem toda a gama de benefícios observados nos microsserviços, especialmente em termos de diversificação de tecnologias e opções de idiomas. As pilhas de tecnologia poliglota não podem ser efetivamente empregadas com a Arquitetura Monolítica Modular.

Microsserviços

Microsserviços é uma arquitetura de software em que uma aplicação é composta por vários serviços independentes e autônomos, cada um representando uma unidade de negócio específica. Cada microsserviço é desenvolvido, implantado e escalado de forma independente. A comunicação entre microsserviços geralmente ocorre por meio de APIs, e cada serviço pode ter seu próprio banco de dados.

Microsserviços, alternativamente chamados de arquitetura de microsserviços, são um estilo de arquitetura que organiza um aplicativo em um conjunto de serviços caracterizado por:

• Capacidade de implantação independente
• Acoplamento fraco
• Organização em torno de capacidades de negócios
• Propriedade por equipes pequenas

Vantagens:

  1. Escalabilidade Independente: Cada microsserviço pode ser escalado independentemente, permitindo otimizar recursos para áreas específicas da aplicação.
  2. Desenvolvimento Independente: Equipes podem desenvolver, testar e implantar microsserviços de forma independente, facilitando a evolução contínua.
  3. Tecnologias Diversas: Cada microsserviço pode ser desenvolvido usando diferentes tecnologias, se necessário.
  4. Fácil de entender :  A simplicidade adicional dos microsserviços permite que os desenvolvedores compreendam melhor a funcionalidade de cada serviço.
  5. Implantações menores e mais rápidas:  Iimplantações mais rápidas são facilitadas por bases de código e escopo menores, permitindo a exploração dos benefícios da implantação contínua.

Desvantagens:

  1. Complexidade Operacional: A operação de uma arquitetura de microsserviços pode ser mais complexa devido à gestão de vários serviços.
  2. Comunicação Distribuída: A comunicação entre microsserviços pode introduzir latência e complexidade adicional.
  3. Desafios de Consistência: Manter a consistência de dados entre microsserviços pode ser um desafio.

Embora os microsserviços representem uma tendência arquitetônica proeminente, eles apresentam complexidades inerentes associadas aos sistemas distribuídos.

Aqui estão mais algumas desvantagens e desafios associados aos designs de microsserviços:

Comunicação complexa entre serviços: serviços independentes exigem tratamento cuidadoso das solicitações, levando a código adicional para gerenciar a comunicação e possíveis interrupções devido à latência.

Intensidade de recursos: A proliferação de serviços implica maiores requisitos de recursos para o gerenciamento de múltiplos bancos de dados e coordenação de transações.

Dificuldade em testes globais: testar aplicativos baseados em microsserviços pode ser complicado em comparação com abordagens monolíticas, exigindo a confirmação de cada serviço dependente antes do teste.

Desafios na depuração: a depuração se torna mais complexa à medida que cada serviço gera seu próprio conjunto de logs, contribuindo para a complexidade da identificação e resolução de problemas.

Desafios de implantação: coordenar implantações entre vários serviços pode ser menos simples do que implantar um aplicativo monolítico, introduzindo complexidades adicionais.

• Adequação ao tamanho da empresa: os microsserviços podem ser ideais para grandes empresas, mas podem ser mais lentos para implementar e excessivamente complicados para empresas menores que exigem iteração rápida e desejam evitar orquestrações complexas.

Afinal qual abordagem usar ?

Para responder a esta pergunta temos que considerar :

Desta forma não existe uma abordagem única que se aplique a todos os cenários, e muitas vezes uma combinação de abordagens pode ser usada, dependendo dos requisitos específicos de cada parte da aplicação.

É fundamental avaliar cuidadosamente os prós e contras em relação às necessidades específicas do projeto antes de decidir pela arquitetura a ser adotada.

E estamos conversados...

"Não vos inquieteis, pois, pelo dia de amanhã, porque o dia de amanhã cuidará de si mesmo. Basta a cada dia o seu mal."
Mateus 6:34

Referências:


José Carlos Macoratti