Aguarde, carregando...

Escalabilidade em arquitetura Microservices

Escalabilidade em arquitetura Microservices
Por: Roberto Silva
Dia 24/04/2019 10h35

Escalabilidade em arquitetura Microservices

Microservices vem ganhando popularidade como uma nova arquitetura de desenvolvimento de aplicações, sendo direcionado por benefícios de maior agilidade nas entregas ao negócio, redução de custos com uso otimizado de recursos computacionais e alta disponibilidade.

A definição entre arquitetura Microservices e Monolítica traz diversos fatores a serem analisados, e Escalabilidade é um dos principais dentre eles.

As arquiteturas tradicionais usam de escalabilidade vertical e horizontal para ampliar a capacidade de processamento:

Escalabilidade Vertical

Com a escalabilidade vertical, a capacidade da aplicação é dimensionada pela capacidade do hardware individual em que a aplicação roda. É por isso então que é chamado de “vertical”: para que a aplicação tenha mais performance se adiciona mais CPU, mais memória, mais IOPS em disco, etc. No entanto, efetivamente a arquitetura da aplicação e da infraestrutura não mudam. Este é um padrão de escalabilidade viável e amplamente utilizado para determinadas aplicações, mas tem como limitação de escalabilidade o próprio hardware.

Escalabilidade Horizontal

Com a escalabilidade horizontal, em vez de aumentar a escala adicionando mais capacidade de hardware individual, a aplicação é arquitetada para que seja escalada adicionando mais instâncias da aplicação. Isso pode ser feito adicionando mais VMs com a aplicação instalada, mais instâncias de aplicação dentro de um serviço de nuvem ou mais containers, ou seja, replicando mais instâncias rodando a mesma aplicação e distribuindo a carga entre elas. Não é necessário hardware caro e pesado para escalabilidade horizontal, pode ser feito com máquinas menores e adicionando muitas delas. No entanto, esse padrão de escalabilidade geralmente requer aplicações que sejam arquitetadas ou ajustadas para funcionarem distribuidamente.

VerTitulo


Escalabilidade com Microservices

Por esse ângulo, alguém se perguntaria porque então fazer escalabilidade de outra forma que não seja horizontal?! No entanto, é preciso lembrar das demandas técnicas das aplicações. E além disso, no que se relaciona com o tema de escalabilidade, é que todas as instâncias que forem “clonadas”, e rodarem atrás de um balanceador de cargas para escalar horizontalmente, estão executando uma instância completa da aplicação. O que pode ser bem indesejável, porque necessariamente a aplicação toda é clonada, e geralmente a carga de uma aplicação não é distribuída uniformemente entre todos os serviços que a compõe.

Por exemplo, uma análise dos logs pode mostrar que o gargalo da aplicação está no serviço de upload de imagens, mas possíveis outros serviços dentro da aplicação como autenticação, controle de profile e demais estão tendo um bom desempenho. Se então a aplicação for escalada horizontalmente, os serviços de upload de imagens será expandido... junto com o restante. Um belo desperdício de recursos.

Na arquitetura de Microservices se divide uma aplicação em unidades independentes e funcionais, os serviços. Não se engane com a palavra micro em Microservices. A divisão de serviços não precisa ser “microscópica”, os serviços da aplicação podem ser divididos da forma mais adequada para a aplicação. Normalmente, são organizados por característica comum de processamento, uso de recursos e arquitetura da aplicação. Dessa forma, podem até mesmo flexibilizar a escolha da linguagem mais apropriada para cada demanda específica.

Voltando ao exemplo, em uma arquitetura Microservices a aplicação executará serviços diferentes como unidades independentes, cada uma com seu próprio tempo de execução, codebase, threads de processamento, etc. Como o gargalo da aplicação é a rotina de upload de imagens, é possível gerar cópias e então escalar apenas esse serviço, enquanto se mantém igual o restante dos serviços. Com Microservices se tem uso mais efetivo de escalabilidade horizontal.

Ao considerar Microservices, há outros fatores para analisar além da escalabilidade. Aplicações stateless nativamente escalam muito bem, enquanto stateful, daemon e batch podem demandar adaptações, mas a arquitetura Microservices com escalabilidade horizontal certamente traz ganhos ao negócio com maior elasticidade e redução de custos por uso otimizado de recursos computacionais.