A migração foi motivada pela necessidade de superar limitações do sistema monolítico tradicional e aproveitar os benefícios de uma estrutura modular, sem abrir mão da simplicidade de deploy que um monólito oferece. A seguir, detalhamos cada arquitetura apresentada no diagrama, destacando as principais diferenças e as justificativas para a mudança.
-
Descrição:
O sistema original é implementado como um monólito, onde todas as funcionalidades e módulos compartilham o mesmo processo e ambiente de execução. -
Características e Desafios:
- Acoplamento Forte:
As funcionalidades estão intimamente ligadas, fazendo com que mudanças em um módulo possam impactar o sistema inteiro. - Escalabilidade Limitada:
O sistema só pode ser escalado como um todo, o que pode levar à utilização ineficiente de recursos. - Manutenção Complexa:
Alterações e correções podem se tornar arriscadas e demoradas devido à falta de separação clara entre os domínios. - Deploy Unificado:
Apesar de simplificar o deploy, o fato de todas as funcionalidades estarem no mesmo pacote dificulta a adoção de práticas de atualização contínua sem riscos.
- Acoplamento Forte:
-
Justificativa para a Mudança:
A alta complexidade e os desafios de manutenção e escalabilidade evidenciaram a necessidade de uma separação melhor dos domínios do sistema, reduzindo o risco de impactos colaterais durante alterações.
-
Descrição:
A nova arquitetura mantém o sistema em um único processo, mas organiza o código em módulos bem definidos, cada um responsável por um domínio específico do negócio. -
Benefícios:
- Baixo Acoplamento:
Os módulos são independentes e se comunicam por meio de interfaces e eventos, o que minimiza dependências diretas. - Escalabilidade Seletiva:
Permite escalar individualmente os módulos críticos sem precisar replicar o sistema inteiro. - Manutenibilidade Melhorada:
Alterações em um módulo podem ser realizadas com menor impacto nos demais, facilitando testes e atualizações. - Organização e Coesão:
Cada módulo agrupa funcionalidades relacionadas, tornando o sistema mais organizado e alinhado com os princípios do DDD.
- Baixo Acoplamento:
-
Justificativa para a Mudança:
Ao adotar o conceito de Monólito Modular, a equipe consegue manter a simplicidade do deploy e a consistência do ambiente monolítico, enquanto aproveita as vantagens da modularização para facilitar a manutenção, permitir escalabilidade seletiva e reduzir riscos durante mudanças.
| Aspecto | Monolito Tradicional | Monólito Modular (MOM) |
|---|---|---|
| Acoplamento | Alto, com forte interdependência entre funcionalidades | Baixo, com módulos isolados e comunicação definida |
| Escalabilidade | Limitada à replicação do sistema completo | Seletiva, permitindo escalonamento individual de módulos |
| Manutenção | Complexa e arriscada com mudanças em larga escala | Mais simples, com testes e atualizações isoladas |
| Deploy | Unificado, porém impactante em caso de alterações | Simples e consistente, com possibilidade de deploys segmentados |
| Organização | Estrutura monolítica sem separação clara de domínios | Organização alinhada com DDD, com responsabilidade bem definida |
- Escalabilidade: Permitir que módulos críticos sejam escalados de forma independente.
- Modularidade: Organizar o código e isolar domínios, facilitando manutenções e evoluções.
- Facilidade de Manutenção: Reduzir o acoplamento entre funcionalidades e melhorar a testabilidade do sistema.
- Alta Disponibilidade: Garantir resiliência e tolerância a falhas.
- Melhoria no Tempo de Resposta: Otimizar a performance e reduzir a latência.
O sistema é dividido em módulos, onde cada um atua de forma autônoma dentro do mesmo processo. Exemplos de módulos:
- Módulo de Produtos
- Módulo de Pedidos
- Módulo de Atendimento
- Módulo de Usuários (Autenticação e Autorização)
Cada módulo comunica-se por meio de interfaces e, quando necessário, utiliza eventos para interagir com outros módulos.
A transição do monolito tradicional para o Monólito Modular foi realizada para:
- Reduzir o acoplamento entre as funcionalidades, evitando que alterações em um módulo afetem o sistema inteiro.
- Facilitar a escalabilidade, permitindo que módulos com alta demanda sejam escalados de forma independente.
- Melhorar a manutenibilidade do sistema, tornando-o mais organizado e alinhado com os princípios de DDD e Arquitetura Limpa.
A escolha por uma arquitetura modular dentro de um monólito representa um equilíbrio estratégico: mantendo a simplicidade do deploy monolítico e, ao mesmo tempo, ganhando a flexibilidade e robustez de uma estrutura modular.

