Olá, bem-vindo a mais um de nossos cursos sobre arquitetura. Este curso estará muito focado em estilos de arquitetura, principalmente em monólitos, monólitos modulares e microserviços. Vamos discutir um pouco sobre as diferenças entre esses estilos, algumas de suas características, o que cada um costuma resolver, quais são as complexidades que se acrescentam quando escolhemos um desses estilos e estratégias ao migrar de estilo ou tomar decisões em nível arquitetônico.
Meu nome é Murilo.
Audiodescrição: Murilo é um homem jovem de trinta e poucos anos, tem a pele clara, cabelo grisalho que começou a aparecer cedo, e possui uma barba um pouco cheia e bem delineada.
Atualmente, somos Lead Software Engineer, algo semelhante a Tech Lead, em uma empresa estadunidense chamada Income Payments, onde nosso produto principal são cartões pré-pagos e gift cards (cartões de presente). Temos dez anos de experiência na área, tendo passado por empresas como Mercado Livre, Itaú, Santander e algumas outras. Nosso foco sempre foi construir sistemas que crescem junto com o negócio, pois acreditamos que, embora as pessoas gostem de criar sistemas mais complexos utilizando novas ferramentas, é fundamental estarmos alinhados com o que realmente gera valor e se encaixa no contexto atual do negócio.
Sintam-se à vontade para nos contatar no LinkedIn, estamos sempre disponíveis para conversar. Esperamos que gostem das aulas e que aprendam bastante. Ficamos muito felizes em estar aqui compartilhando isso com vocês. Muito obrigado.
Olá, nesta primeira aula, começaremos discutindo um tema que é bastante polêmico em nossa área de Arquitetura e Engenharia de Software, principalmente porque é frequentemente mal compreendido: a questão do monolito. Este é um estilo arquitetônico que utilizamos em nossos sistemas e aplicações. Ao longo dos últimos anos e décadas, o monolito tem sido associado a algo legado, pouco performante e complexo.
Vamos iniciar esta aula falando sobre o que realmente é esse estilo arquitetônico, o que ele representa, e tentaremos desmistificar a ideia de que não é uma decisão sustentável a longo prazo. Assim, começamos discutindo o que é e o que não é um monolito. Se pensarmos no significado, a origem do termo refere-se a uma grande pedra, um grande objeto. Esse termo foi introduzido em nossa área de Engenharia para representar uma aplicação que encapsula toda a lógica e as regras de negócio de nossa empresa ou sistema.
Com o surgimento dos microserviços nos últimos anos, e o conceito desse estilo arquitetônico diferente, criou-se a ideia de que o monolito deixa de ser sustentável a longo prazo. No entanto, isso não é uma verdade universal, e aqui discutiremos muitos desses pontos para tentar entender quais são as propriedades de um monolito e o que acontece a longo prazo para que ele seja considerado obsoleto ou legado, além de como podemos evitar que isso ocorra.
Por exemplo, nesta apresentação, começamos focando nos pontos principais. O que é um monolito? É um artefato, uma aplicação unificada. Desdobramos nossa aplicação, com toda a regra de negócio embutida, como em um e-commerce, onde falamos de notificações, pedidos, clientes, tudo em uma única aplicação.
Com a introdução das aplicações SPA (Single Page Applications - Aplicações de Página Única) para o front-end, esse conceito evoluiu um pouco. Antes, o monolito englobava tudo, incluindo a renderização das páginas junto com a lógica de negócio. Desdobrávamos um único artefato, e a pessoa acessava e já recebia as páginas dali. Agora, esse conceito evoluiu, e temos monolitos que executam as regras de negócio, mas focados no back-end. O front-end pode ser considerado uma aplicação SPA com outro framework, que não faz parte do conceito de monolito que discutimos atualmente.
Quando falamos de um monolito, referimo-nos ao back-end da aplicação, um bloco único, um único desdobramento. No entanto, como mencionado no início do curso, ele pode ser organizado, testado de forma concisa e com qualidade, além de ser escalável. Esse é um ponto que discutiremos ao longo de nossas aulas.
Um monolito é diferente de um legado. A decisão arquitetônica, o estilo arquitetônico que escolhemos para nossa aplicação, não está diretamente ligado ao desempenho. Ser um monolito não está diretamente relacionado a isso. Essa percepção foi construída ao longo do tempo. Portanto, sistemas novos podem e devem começar monolíticos. Por quê? Porque ainda não temos muito contexto sobre como o sistema será estruturado.
Não faz sentido querer iniciar uma empresa, uma startup, ou um sistema com uma arquitetura distribuída, como em microsserviços, se não sabemos como dividir esses microsserviços. Ainda não temos o conhecimento do negócio para definir onde estará a fronteira que separa um microsserviço de outro. Portanto, começando com o monolito, veremos nas outras aulas que teremos liberdade para gerenciar isso de uma forma muito mais fácil e, a longo prazo, podemos evoluí-lo se assim desejarmos. Se quisermos mudar nosso estilo arquitetônico, podemos, mas no início temos essa abertura.
Veremos alguns casos de várias empresas multimilionárias que até hoje executam monolitos em poucas instâncias, com toda a lógica de negócio embutida nesse monolito, mas desacoplada com limites definidos, fronteiras, o que faz com que esse monolito realmente seja performante e tenha uma manutenção simples. As equipes de desenvolvimento podem trabalhar nessa base de forma desacoplada e sem interferir no trabalho umas das outras. Falaremos um pouco sobre isso também.
Reforçando, o código ruim existirá em qualquer estilo arquitetônico. E não apenas código ruim, mas uma arquitetura deficiente, considerando outras decisões, a estrutura do software, a própria arquitetura de software. O código, independentemente do estilo arquitetônico que estivermos utilizando, se não tivermos um processo bem definido, uma governança clara, padrões definidos, isso acabará gerando um sistema difícil de manter, com baixo desempenho, no qual ninguém quererá trabalhar, e esse sim, acabará se tornando um legado.
Por exemplo, temos uma estrutura de monolito mais adequada para uma solução e uma estrutura mais caótica. Existe até um termo cunhado na comunidade, que é Big Ball of Mud (grande bola de lama), que realmente representa essa dificuldade para manter uma solução. Fazemos uma alteração e, de repente, algo se quebra em outro lugar, como se fosse um monte de lama que se desmorona. As coisas não se mantêm. Tentamos iniciar um novo padrão arquitetônico, mas depois vem outra equipe, mexe, ou não conseguimos mantê-lo porque o código já está muito desestruturado.
No monolito mais estruturado, podemos ver algumas separações mais claras do tipo de serviço. Se estivermos usando uma estrutura por camadas, controller, service, repository, ou se formos usar use cases (casos de uso), que seria de outra forma, podemos ver que, apesar de estar tudo ali, ainda se mantém uma estrutura que a pessoa desenvolvedora vai olhar, à primeira vista, e poderá entender o fluxo e talvez fazer as alterações necessárias. Diferente do outro lado, que representa realmente tudo se comunicando com tudo, provavelmente com algumas dependências circulares, algumas coisas que não farão sentido.
Então, a frase de encerramento deste slide: o estilo não causa a desordem. É a falta de disciplina, a falta de governança, de padrões definidos desde o início do projeto e tudo isso. Temos até uma menção a Martin Fowler, Monolith First. Ele escreveu um artigo sobre isso, focando realmente nesse conceito de que é uma grande ideia começar um sistema, uma arquitetura com um monolito. Porque, como dissemos no início, não temos um conhecimento profundo do que deve ser separado ou não, de como esses domínios devem ser compostos ou não. Assim, tendo um monolito, facilita muito no início para criar mais conhecimento sobre o negócio e ter base ao criar essas fronteiras.
Aqui, fronteiras equivocadas custam mais do que não ter fronteiras. Pensar que sabemos realmente como funciona esse domínio e já começar com uma arquitetura mais distribuída, onde os domínios não estão realmente corretos, fará com que esses serviços, esses componentes que criamos, fiquem muito acoplados. Não poderemos fazer uma alteração em um sem fazer no outro. Isso complicará muito nossa vida no futuro.
Nesta aula, vamos discutir as vantagens de utilizar uma arquitetura monolítica em um sistema. Esse tema não é amplamente abordado na comunidade, pois, ao aprender, muitos tendem a focar em microserviços. No entanto, há diversas vantagens em adotar um estilo arquitetônico monolítico, e é sobre isso que vamos falar agora.
Inicialmente, podemos destacar a simplicidade operacional. Quando temos um único artefato para implantar, isso reduz significativamente o overhead na parte de infraestrutura e DevOps, que seria necessário em um estilo mais distribuído. Com um artefato, realizamos o build, criamos um pipeline, fazemos o build e o implantamos. Talvez o front-end esteja separado, mas vamos nos concentrar no conceito de monolito para uma arquitetura onde o back-end encapsula as regras de negócio.
Outra vantagem é a menor superfície de monitoramento. Podemos imaginar que, mesmo com múltiplas instâncias do mesmo monolito, trata-se de uma única aplicação. Não enfrentamos os problemas que surgem em sistemas distribuídos, e vamos aprofundar isso no futuro. Aqui, temos uma aplicação em execução, que pode estar em múltiplas instâncias, com logs simples e stack trace dos erros e do fluxo dos métodos chamados, tornando tudo mais simples.
Como mencionado, tudo está no mesmo processo. Temos o repositório, o monolito em execução no sistema, a base de código com o código presente, e podemos carregar o projeto completo no IDE. Toda a lógica de negócio, endpoints e diferentes domínios estão ali. Muitas vezes, isso é visto como uma desvantagem, pois a complexidade parece estar toda misturada. No entanto, com governança e estrutura, é possível organizar de forma eficiente, permitindo que todo o contexto esteja disponível para trabalhar, o que é muito mais simples do que fazer alterações em serviços separados e entender o que está acontecendo.
O debug de ponta a ponta é outra vantagem. Quando uma solicitação entra, todo o fluxo de negócio ocorre internamente, incluindo a conexão com bancos de dados, e podemos ver tudo junto. A pessoa desenvolvedora, por exemplo, pode executar o debug localmente e visualizar o que está acontecendo de ponta a ponta. Os testes de integração também podem ser executados localmente, sem a necessidade de se preocupar com serviços externos para realizar esses testes e processos.
Além disso, o compilador é um aliado nas mudanças e refatorações. Com tudo em uma única base, é mais fácil garantir que não estamos quebrando contratos de comunicação entre partes. Se os serviços estivessem separados e desacoplados, seria mais difícil garantir que uma alteração não afetaria outra parte. Com tudo dentro da mesma estrutura, em tempo de compilação, já podemos identificar o que pode ser afetado, como um módulo ou domínio que estava usando um campo que foi removido. Isso é muito interessante e vantajoso.
Aqui, discutindo um pouco sobre IA no contexto de monolitos e a integração de todo o contexto, isso chamou nossa atenção. Inicialmente, pensávamos que era uma grande vantagem, considerando que as IDEs atuais já são AI First (focadas em IA) e AI Native (nativas em IA), oferecendo várias ferramentas para interagir com o código, alimentar o contexto de uma LLM (Modelo de Linguagem Grande) e outras funcionalidades. Com um monolito, ao carregar e executar a aplicação, a IDE se integra e obtém todo o contexto da aplicação e o que está ocorrendo.
No entanto, atualmente, falar de IA e programação com IA é algo muito novo e em rápido desenvolvimento. Surgem novas ferramentas, enquanto outras são rapidamente deprecadas. Portanto, não podemos afirmar que isso seja uma vantagem definitiva; é algo a ser considerado ao tomar decisões arquitetônicas. Por exemplo, ao carregar uma aplicação em uma IDE, já temos todo o contexto, mas qual é o impacto disso no consumo de tokens da IA? Ter tudo em um único lugar ou, por outro lado, ter mais componentes e serviços menores pode oferecer um contexto mais granular e específico de um domínio. Devemos sempre ter isso em mente ao tomar decisões, pois a IA pode impactar dependendo do sistema, da empresa, das ferramentas utilizadas, como LLM, autocompletado, revisão de PR, entre outras. Isso pode afetar a decisão arquitetônica entre monolitos, sistemas distribuídos ou outras opções.
Voltando à questão do monolito, temos a vantagem das transações ACID de forma gratuita. Quando falamos de banco de dados e transações, a atomicidade que essas transações proporcionam em um monolito é uma grande vantagem. Em sistemas distribuídos, isso se torna um dos principais desafios. Discutiremos os trade-offs de usar um sistema distribuído ou não, e as vantagens e desvantagens. A consistência de dados é uma grande desvantagem ao sair do monolito, pois não há uma forma simples e eficiente de garantir isso. Em microserviços, existem estratégias para garantir consistência, ou consistência eventual, mas não são tão assertivas e eficientes quanto uma transação direta em nível de banco de dados, algo que o monolito oferece ao integrar todo o contexto e fluxo em um único sistema.
Não precisamos nos aprofundar muito, mas ao falar de latência em um monolito, estamos lidando com chamadas de método a nível de processo, algo muito rápido, em nanosegundos. Em uma arquitetura distribuída, há um overhead de saltos de rede para comunicação, independentemente do protocolo escolhido, seja HTTP, gRPC, SOAP, etc. Isso resulta em um overhead direto ao sair de uma arquitetura monolítica. A diferença de latência é de ordens de magnitude, de nano para microsegundos, o que pode impactar o desempenho do negócio, dependendo do contexto e domínio do sistema.
Além disso, ao enviar uma solicitação HTTP, é necessário serializar e desserializar a resposta, seja em JSON, XML, etc. Isso também gera um overhead ao transformar o objeto interno do seu idioma de programação em algo que será transmitido pela rede, resultando em um overhead significativo.
O curso Arquitetura de sistemas: organizar monólitos e migrar para microserviços possui 208 minutos de vídeos, em um total de 39 atividades. Gostou? Conheça nossos outros cursos de Arquitetura em DevOps, ou leia nossos artigos de DevOps.
Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:
O Plano Plus evoluiu: agora com Luri para impulsionar sua carreira com os melhores cursos e acesso à maior comunidade tech.
2 anos de Alura
Matricule-se no plano PLUS 24 e garanta:
Jornada de estudos progressiva que te guia desde os fundamentos até a atuação prática. Você acompanha sua evolução, entende os próximos passos e se aprofunda nos conteúdos com quem é referência no mercado.
Programação, Data Science, Front-end, DevOps, Mobile, Inovação & Gestão, UX & Design, Inteligência Artificial
Formações com mais de 1500 cursos atualizados e novos lançamentos semanais, em Programação, Inteligência Artificial, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
A cada curso ou formação concluído, um novo certificado para turbinar seu currículo e LinkedIn.
Acesso à inteligência artificial da Alura.
No Discord, você participa de eventos exclusivos, pode tirar dúvidas em estudos colaborativos e ainda conta com mentorias em grupo com especialistas de diversas áreas.
Faça parte da maior comunidade Dev do país e crie conexões com mais de 120 mil pessoas no Discord.
Acesso ilimitado ao catálogo de Imersões da Alura para praticar conhecimentos em diferentes áreas.
Explore um universo de possibilidades na palma da sua mão. Baixe as aulas para assistir offline, onde e quando quiser.
Luri Vision chegou no Plano Pro: a IA da Alura que enxerga suas dúvidas, acelera seu aprendizado e conta também com o Alura Língua que prepara você para competir no mercado internacional.
2 anos de Alura
Todos os benefícios do PLUS 24 e mais vantagens exclusivas:
Chat, busca, exercícios abertos, revisão de aula, geração de legenda para certificado.
Envie imagens para a Luri e ela te ajuda a solucionar problemas, identificar erros, esclarecer gráficos, analisar design e muito mais.
Aprenda um novo idioma e expanda seus horizontes profissionais. Cursos de Inglês, Espanhol e Inglês para Devs, 100% focado em tecnologia.
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.
Para quem quer atingir seus objetivos mais rápido: Luri Vision ilimitado, vagas de emprego exclusivas e mentorias para acelerar cada etapa da jornada.
2 anos de Alura
Todos os benefícios do PRO 24 e mais vantagens exclusivas:
Catálogo de tecnologia para quem é da área de Marketing
Envie imagens para a Luri e ela te ajuda a solucionar problemas, identificar erros, esclarecer gráficos, analisar design e muito mais de forma ilimitada.
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.
Conecte-se ao mercado com mentoria individual personalizada, vagas exclusivas e networking estratégico que impulsionam sua carreira tech para o próximo nível.