Escolar Documentos
Profissional Documentos
Cultura Documentos
Arquitetura de
Microsserviços
Márcio Galvão
galva.marcio@gmail.com
2021
Como veremos, idealmente cada microsserviço deve "fazer uma coisa só,
bem feita", entregando alguma funcionalidade de negócio em um contexto
bem definido.
Benefícios
A abordagem de microsserviços traz vários benefícios.
Embora todas estas funções possam fazer parte de uma mesma aplicação,
os requisitos de escalabilidade, desempenho, tolerância, segurança e
resiliência de cada uma são diferentes. Se esta aplicação for construída de
forma monolítica não há muito o que fazer - ou se escala toda a aplicação
(incluindo as partes da aplicação que não precisam de muitos recursos), ou
o serviço (funcionalidade) que precisa de maior escalabilidade pode virar
um gargalo.
4
Por outro lado, se esta mesma aplicação de e-commerce for escrita com
arquitetura de microsserviços torna-se possível por exemplo ter um
microsserviço de "Catálogo" - projetado para atender muitos usuários
simultaneamente (escalabilidade), um outro microsserviço de "Carrinho de
compras", e talvez um terceiro microsserviço para "Pagamento com cartão"
(este com alguns requisitos específicos de segurança), e cada um estes
microsserviços pode ser dimensionado e escalado (em certos casos de
forma automática!) em função de suas necessidades específicas de
processamento, armazenamento ou banda de rede para suportar a
demanda.
Desafios
Se por um lado a arquitetura de microsserviços traz benefícios, ela também
traz desafios e introduz um custo de maior complexidade que precisa ser
justificado - em oposição a apenas seguir o hype tecnológico do momento
(voltaremos a este ponto mais adiante).
6
Em certos cenários podem ser a melhor solução, mas para outros cenários
o custo (complexidade) da abordagem pode não compensar os benefícios
que ela vai trazer. Muitas das tecnologias envolvidas são novas. O uso de
microsserviços requer certas competências de desenvolvimento, qualidade
(testes) e processos de DevOps, requerendo familiaridade com certos
patterns ou padrões desenvolvimento (por exemplo, padrões de resiliência)
e tecnologias.
O fato é que nem todos podem estar preparados para criar, fazer o deploy
e em seguida dar conta do suporte e da manutenção de microsserviços
seguindo as boas práticas recomendadas.
Martin Fowler alerta sobre isso com sua habitual clareza em [4] e [5], e
sugere inclusive que existe uma "altura mínima que um time de
desenvolvedores precisa ter para utilizar microsserviços", uma lista de pré-
requisitos que uma equipe precisa satisfazer em termos de maturidade e
capacidade técnica para que possa entrar no jogo dos microsserviços.
Se, por outro lado, surge a impressão de que o microsserviço está fazendo
muitas coisas diferentes em oposição a "fazer uma coisa só, bem feito" isso
sugere que talvez ele possa ser dividido em dois ou mais microsserviços
autônomos. Há alguns patterns que podem ajudar na identificação destas
fronteiras, como o BC (Bounded Context).
Para lidar com isso, o desenvolvedor deverá estar familiarizado com certas
técnicas de agregação de dados, como o conceito de CQRS (Command and
Query Responsibility Segregation) [7], que envolve simplificadamente
duplicar os dados em diferentes serviços, bem como conhecer técnicas
como o uso de tabelas não normalizadas apenas de leitura (que já contêm
dados de vários microsserviços apenas para servir consultas), ou a
exportação de dados de vários microsserviços para serem agregados em
algum banco unificado (cold data) permitindo a geração de relatórios e
consultas) que não requeiram dados atualizados em tempo real e outros.
Note que a aplicação pode ter vários clientes diferentes (web app, mobile)
como front end e utiliza diferentes microsserviços como back end. Nesta
abordagem, cada microsserviço expõe um endpoint público (uma URL a
partir do qual pode ser acessado).
API Gateway
Uma melhoria que se poderia fazer neste modelo para evitar o acesso
direto das aplicações nos microserviços é a utilização de um padrão
denominado API Gateway (figura). O Gateway atua como um agregador, e
oferece um ponto único de acesso das aplicações clientes para todos os
microsserviços existentes.
16
4. Resiliência
5. Contratos
Como já deve ter ficado claro neste ponto, a necessidade de uso de padrões
de consistência eventual (que são mais complexos de se implementar do
que os tradicionais JOINS da linguagem SQL) e da comunicação assíncrona
entre microsserviços (mais sofisticada que a comunicação utilizada em
aplicações monolíticas através de function calls, por exemplo) introduz de
fato um razoável "custo de complexidade" na escolha da arquitetura de
microsserviços.
19
Conclusão
Sam Newman nos alerta em [11] que "quanto menos você compreender o
domínio, mais difícil será definir as fronteiras" para seus microsserviços, e
um erro aqui poderá ter custos elevados no futuro. Assim, uma boa
estratégia é começar com aplicações monolíticas, estabilizar seu
entendimento, e depois verificar quais partes da aplicação podem e devem
ser isoladas como microsserviços independentes. A mudança para os
microsserviços pode ser gradual, não precisa ser uma ruptura.
22
Referências
1 https://pt.wikipedia.org/wiki/Service-oriented_architecture
2 https://docs.microsoft.com/en-
us/azure/architecture/guide/architecture-styles/n-tier
3 _NET-Microservices-Architecture-for-Containerized-NET-Applications-
(Microsoft-eBook). Cesar de la Torre, Bill Wagner, Mike Rousos - Microsoft
Corporation. DOWNLOAD available at:
https://aka.ms/microservicesebook2 _COPI, I. M. 1981: Introdução à
Lógica. Editora Mestre Jou.
http://www.martinfowler.com/articles/microservices.html
http://martinfowler.com/bliki/MicroservicePrerequisites.html
6 _Eventual consistency -
https://en.wikipedia.org/wiki/Eventual_consistency
http://martinfowler.com/bliki/CQRS.html
http://martinfowler.com/bliki/PolyglotPersistence.html
9 _https://docs.microsoft.com/en-
us/azure/architecture/patterns/bulkhead
10 _https://docs.microsoft.com/en-
us/azure/architecture/patterns/circuit-breaker