Nos últimos anos, o debate entre monolitos e microsserviços dominou as discussões em engenharia de software, muitas vezes favorecendo a adoção dos microsserviços como a solução definitiva. Porém, à medida que essas arquiteturas evoluíram e novos desafios surgiram, tornou-se evidente que microsserviços não são a solução perfeita para todos os cenários. Para muitas empresas, especialmente as de menor porte ou em estágio inicial, a complexidade e os custos de operar uma arquitetura de microsserviços podem ser exagerados. É nesse contexto que os macroservices e/ou monolitos modulares, emergem como uma solução intermediária viável.
Neste artigo, exploraremos como os macroservices podem resolver problemas enfrentados tanto em monolitos quanto em microsserviços e como eles podem ser a escolha mais adequada para a maioria dos projetos de software. Vamos discutir suas vantagens, desvantagens e onde essa abordagem se encaixa no cenário atual de arquitetura de sistemas.
Disclaimer: Eu acredito que Macroservices e Monolitos modulares, em sua essência partem de princípios similares, porém acredito que a similaridade vai até um certo ponto. Acredito que existam diferenças entre macrosserviços e monolitos modulares, porém neste artigo não irei tratá-las de uma forma detalhada, ok?
O que são Macroservices?
Os macroservices podem ser descritos como uma evolução dos monolitos modulares. Ao contrário dos microsserviços, que buscam isolar completamente cada funcionalidade em serviços independentes, os macroservices agrupam funcionalidades maiores, mas ainda de forma modular. A ideia é ter serviços mais robustos e autônomos, mas sem fragmentar demais a arquitetura, o que geralmente traz uma série de complexidades adicionais.
Em vez de dezenas de pequenos microsserviços distribuídos, em uma arquitetura de macroservices, você pode ter cinco ou seis módulos principais (macroservices), que ainda compartilham recursos, dados e infraestrutura. Esses serviços são grandes o suficiente para agrupar funcionalidades relacionadas, mas não tanto quanto um monolito completo.
Um grande princípio que ajuda a corroborar com o conceito de macrosservices, é o próprio DOMA, que por mais que tenha surgido para microservices, apresenta de forma muito objetiva este conceito de agrupamento de microsserviços, portanto recomendo fortemente a leitura sobre o conceito, para conseguir entender ainda mais sobre a teoria de micro e macrosserviços.
A Evolução das Arquiteturas: Monolito, Microsserviços e Macroservices
Monolitos
Tradicionalmente, a maioria dos sistemas eram construídos como monolitos, onde todo o código-fonte de uma aplicação era unificado em uma única base de código. Embora isso facilite o gerenciamento no início, monolitos tendem a crescer e se tornar complexos e difíceis de escalar ou modificar. Uma alteração em um módulo pode impactar outros, resultando em “builds” demorados e maior risco de falhas.
Microsserviços
Microsserviços surgiram como uma solução para os problemas de escalabilidade e complexidade dos monolitos. Cada microsserviço é desenvolvido, implementado e escalado de forma independente, permitindo maior flexibilidade. No entanto, essa independência traz novos desafios, como orquestração de serviços, gerenciamento de APIs, monitoramento distribuído e latência de comunicação entre serviços.
O custo operacional de microsserviços é elevado. Como mencionado no exemplo da Amazon Prime, a decisão de reduzir o uso de microsserviços economizou 90% dos custos operacionais . Esse cenário exemplifica que, apesar de suas vantagens, os microsserviços podem rapidamente se tornar um fardo financeiro e técnico se não forem bem implementados e gerenciados.
Macroservices: O Meio do Caminho
Os macroservices vêm para preencher essa lacuna, oferecendo um meio-termo entre os dois extremos. Eles permitem modularidade e segmentação lógica das funcionalidades, sem a complexidade exagerada dos microsserviços. É uma abordagem que favorece a simplicidade da implementação, porém sem sacrificar a escalabilidade e a flexibilidade.
Pontos-chave dos macroservices:
- Modularidade estruturada: Em vez de muitos microsserviços, os macroservices agrupam funcionalidades maiores que fazem sentido juntas.
- Menos dependências externas: Com menos serviços, há menos interfaces e menos pontos de falha na comunicação.
- Compartilhamento de recursos e dados: Diferente dos microsserviços, onde cada serviço tem seu banco de dados, os macroservices podem compartilhar dados de maneira mais eficiente, sem a necessidade de replicação excessiva.
Comparando as Arquiteturas: Monolitos, Macroservices e Microsserviços
Característica | Monolito | Macroservices | Microsserviços |
---|---|---|---|
Complexidade | Baixa no início, alta com o tempo | Moderada | Alta |
Escalabilidade | Limitada | Moderada | Alta |
Facilidade de Manutenção | Difícil em grandes sistemas | Relativamente fácil | Complexa |
Custos Operacionais | Baixos | Moderados | Altos |
Velocidade de Implementação | Rápida | Moderada | Lenta |
Tolerância a Falhas | Baixa (SPOF) | Moderada (alguns serviços independentes) | Alta (cada serviço é isolado) |
Gestão de Equipes | Equipes pequenas podem gerenciar | Moderado, equipes menores que microsserviços | Requer múltiplas equipes para diferentes serviços |
Benchmarks e Casos de Uso
Para fornecer uma base prática, consideremos alguns cenários em que empresas optaram por transições arquiteturais e seus impactos:
- Amazon Prime: Como mencionado, a decisão de migrar partes do sistema de volta para uma arquitetura mais monolítica economizou 90% dos custos operacionais . Isso demonstra que a complexidade adicionada pelos microsserviços nem sempre vale o custo.
- Airbnb e Uber: Ambas as empresas adotaram uma arquitetura de microsserviços devido à sua necessidade de escalabilidade massiva. No entanto, é importante notar que a adoção foi progressiva, e inicialmente essas empresas operavam monolitos modulares.
- Netflix: Netflix é um dos maiores casos de sucesso de microsserviços, mas essa escolha foi feita devido ao imenso tráfego global e à necessidade de deploys contínuos em diferentes regiões. Empresas menores podem não justificar essa complexidade.
Como os macrosserviços resolvem problemas com microsserviços
Como vimos com o case da Amazon, os microsserviços não são a melhor solução para todos. Embora os microsserviços possam ser realmente revolucionários quando usados da maneira certa, eles também podem causar inchaço, aumentar o atraso e aumentar a sobrecarga, os custos de produção e as despesas operacionais exponencialmente.
Aqui estão algumas maneiras pelas quais os macrosserviços podem ajudar a resolver alguns problemas comuns causados por microsserviços.
Design
O burburinho em torno dos microsserviços inspirou muitas pessoas a entrar na onda, mesmo que houvesse pouca justificativa técnica. Implementar um microsserviço com pouca previsão é uma maneira fantástica de um microsserviço sair do controle.
Os macrosserviços exigem previsão e planejamento por sua própria natureza. Visto que os macrosserviços são compostos de funções individuais agrupadas, você precisa pensar em recursos compartilhados, fluxo de dados, permissões e escopo como parte do processo de design.
Monitoramento
Os microsserviços confundem muitas soluções de monitoramento tradicionais. As soluções de monitoramento convencionais podem medir a frequência com que um recurso específico é invocado. No entanto, cada invocação pode exigir várias funções, o que significa que você não está obtendo uma imagem completa simplesmente medindo chamadas de API. Os macrosserviços tornam mais simples manter o controle do tráfego e quais recursos estão sendo usados, pois várias funções são agrupadas e têm mais área de superfície para medir.
Segurança
Os microsserviços também podem ser um risco de segurança. Os microsserviços geralmente são distribuídos em várias plataformas de nuvem, resultando em maior risco e visibilidade reduzida de componentes individuais. Cada microsserviço precisa se comunicar com recursos externos também, o que também cria riscos de segurança. Por fim, os microsserviços dependem de dados distribuídos, o que aumenta a probabilidade de dados comprometidos e violações de dados. Os macrosserviços reduzem todos esses riscos. As interações externas são minimizadas e os dados são menos vulneráveis. A autenticação é mais simples, pois há menos tráfego vindo de vários pontos.
Simplifica os testes
Testar microsserviços tem desafios inerentes. Cada microsserviço precisa ser testado individualmente, por exemplo. Diferentes microsserviços também podem viver em servidores diferentes, o que pode criar problemas com autorização e permissões. Os serviços podem mudar entre servidores para cada sessão individual, complicando ainda mais as coisas. Agrupar serviços e funções em um macrosserviço ajuda a facilitar os testes. Também é mais fácil e menos demorado configurar permissões e autorizações.
Reduz o Exagero
A escalabilidade é um dos principais pontos de venda dos microsserviços. Embora seja importante estar pronto para qualquer coisa, muitos aplicativos nunca se tornarão tão grandes quanto Netflix, Amazon ou Uber. Simplesmente não é necessário ter tudo descentralizado e distribuído em vários servidores e ambientes virtuais. Adotar macrosserviços pode ajudar você a manter o número, o tamanho e o escopo dos microsserviços no mínimo, para que você tenha apenas o que precisa. O melhor de tudo é que os macrosserviços ainda são adaptáveis, então eles são capazes de atender a picos inesperados de demanda, caso a situação exija.
Quando Usar Macroservices?
Macroservices podem ser a melhor escolha quando:
- Sua aplicação precisa de uma escalabilidade moderada, mas ainda não justifica a complexidade dos microsserviços.
- Seu time é relativamente pequeno e prefere evitar o overhead de gerenciar muitas interfaces e APIs independentes.
- Seu sistema pode se beneficiar de uma divisão modular, sem a fragmentação excessiva dos microsserviços.
- Você precisa de uma arquitetura mais simples e barata para começar, mas quer se preparar para um crescimento futuro.
Perguntas que você deve fazer antes de escolher uma arquitetura:
- Qual é o tamanho estimado do meu projeto?
- Quão escalável eu preciso que ele seja nos próximos anos?
- Quantas pessoas vão trabalhar na aplicação?
- Quais são meus recursos e meu orçamento atual?
- Qual é o prazo de entrega do projeto?
Conclusão
Macroservices oferecem uma alternativa viável, especialmente para empresas que querem flexibilidade sem comprometer a simplicidade. Eles permitem modularidade e segmentação controlada sem os altos custos e a complexidade dos microsserviços. Para a maioria das empresas, especialmente as menores ou em crescimento, um monolito modular bem estruturado (macroservices) pode ser a escolha mais equilibrada e eficiente, evitando os problemas dos monolitos “tradicionais” e a sobrecarga dos microsserviços.
A arquitetura ideal, no entanto, sempre dependerá do contexto específico do projeto. Para muitos, macroservices podem ser o caminho do meio que permite crescer de forma sustentável, sem sacrificar a simplicidade operacional.
Esse artigo reforça a ideia de que macroservices podem atender à maioria dos casos de engenharia de software, especialmente onde o custo e a simplicidade são prioridades.