Danilo Lira

Mobile & Web Software Engineer

Dimensionamento automático em microsserviços

Intro

Quando se pensa em utilizar microsserviços, uma das principais vantagens é a escalabilidade. Uma arquitetura baseada em microsserviços tem facilidade para crescer e atender a demanda de usuários, seja um e-commerce durante a black friday ou a netflix quando lança uma série nova.

Para atender a demanda de usuários, a infraestrutura de um software pode ser dimensionado verticalmente (scale up/down) ou horizontalmente (scale out/in). Crescer verticalmente significa adicionar ou remover recursos de um único servidor já existente na rede, como aumentar a memória de um computador, por exemplo. Já crescer horizontalmente significa adicionar ou remover computadores para uma aplicação de software distribuída.

Mas como esse dimensionamento é feito? Apesar de existir a possibilidade do dimensionamento ser feito de forma manual, no contexto onde um software pode estar dividido em dezenas ou até centenas de microsserviços, fazer isso de forma manual seria muito custoso, cansativo e suscetível a erros humanos. A solução para esse problema é o dimensionamento automático.

Conceito básico

Dimensionamento automático, ou auto scaling, é um método utilizado na computação em nuvem, onde a quantidade de recursos computacionais é aumentada ou diminuída para atender a demanda de usuários de forma automática. Essa mudança automática pode ser feita com base em diversos fatores como: datas, quantidade de usuários acessando, necessidade de uso crítico, entre outros.

Esse método traz diversos benefícios, como: momentos de repouso durante períodos de baixa carga, diminuindo custos de eletricidade, caso a empresa tenha seus próprios servidores, ou taxas de provedores de nuvem; proteger contra falha de hardware, redes e aplicativos; oferecer maior tempo de atividade e mais disponibilidade nos casos em que as cargas de trabalho são variáveis e imprevisíveis; entre outros.

Funcionamento

Existem alguns tipos de dimensionamento automático: agendado, dinâmico e preditivo, cada um deles têm um funcionamento diferente e deve ser escolhido a partir das necessidades do negócio.

O primeiro tipo é utilizado quando se sabe exatamente quando será necessário aumentar ou diminuir o número de instâncias do serviço e o exemplo mais conhecido disso são datas festivas quando sites de e-commerce possuem picos de acesso. Neste tipo de escalonamento a criação ou remoção de instâncias é agendada para um horário ou dia específico e o número dessas instâncias é proporcional ao evento esperado.

Já o dimensionamento automático dinâmico se refere ao processo de escalar o serviço automaticamente a partir da demanda. Neste caso a criação de novas instâncias ocorre seguindo alguns parâmetros configurados pelo responsável pelo sistema para o processo de dimensionamento. Esse tipo de dimensionamento é bastante interessante para sistemas que possuem bastante variações de picos e vales de forma pouco padronizada

Por último há o dimensionamento automático preditivo. Esse tipo de dimensionamento é programado para definir automaticamente o número de instâncias baseado na previsão da demanda para aquele momento. O funcionamento desse método é baseado em inteligência artificial e essa tecnologia pode prever tráfegos semanais e até diários, com o uso desta tecnologia esse tipo pode oferecer o melhor custo benefício de todos os tipos de dimensionamento já que ele vai se regulando e ficando cada vez mais preciso.

Dimensionamento dinâmico em microsserviços

Os vários tipos de dimensionamento citados anteriormente podem ser aplicados ao contexto de aplicações baseadas em microsserviços. Em aplicações com essa estrutura a utilização do dimensionamento dinâmico se torna ainda mais importante quando comparado com aplicações monolíticas. Neste padrão o escalonamento deixa de ser voltado para toda a aplicação e se torna voltado apenas para os serviços necessários.

O objetivo do dimensionamento com microsserviços é o mesmo das aplicações monolíticas, porém neste primeiro padrão os benefícios são ainda maiores. A grande vantagem do escalonamento é a minimização de recursos necessários, já que há um custo para aumentar a capacidade de atendimento de um serviço, sendo assim é possível aumentar a capacidade apenas dos serviços mais requisitados, deixando os outros com a mesma potência. Isso torna as aplicações muito mais dinâmicas e possibilita uma maior disponibilidade de serviço com custo bastante reduzido.

Para utilizar essa técnica em microsserviços é necessário monitorar a carga de cada um dos serviços. O monitoramento precisa passar por algumas métricas definidas e pode ser feito utilizando aplicações de container como o Docker e orquestradores como o Kubernetes. A utilização de um API Gateway também pode ser bastante útil para o monitoramento de um serviço e, consequentemente, para análise das métricas de dimensionamento.

Aplicação em microsserviços

Como exemplo de aplicação, vamos criar um cenário aqui:

Serão dois serviços que conversam entre si internamente e um API gateway responsável por gerenciar as requisições externas, o primeiro serviço retornando um super-herói e o segundo um respectivo país, a ideia é que relamente seja algo bem simples, com foco apenas em entender melhor os conceitos.

Primeiramente, é necessário um planejamento visando a escalabilidade, iniciando com algo básico, hospedagem do serviço, temos várias opções de grandes players do mercado como AWS, Azure, Google Cloud, Heroku. 
 No nosso exemplo poderíamos usar a Azure da microsoft como serviço de cloud, nela se consegue dar deploy dos serviços de forma bem fácil utilizando o conceito de container, podendo usar o docker para separar os serviços em containers diferentes, assim escalando eles de forma individual.

Para gerenciar tudo isso, é importante um orquestrador, podendo usar o próprio serviço de Kubernetes da Azure, o Azure Kubernetes Service (AKS), para trabalhar como api gateway e como gerenciador dos containers da aplicação.

Tá, mas como é que se gerencia isso tudo?

O responsável pelo gerenciamento desse dimensionamento é o Gerente de ciclo de vida (GCV), ou orquestrador, como foi dito acima, Kubernetes é um exemplo de orquestrador, sendo essencial para gerenciamento desde o merge até chegar nos containers.

Quando é feito o merge, rodam os testes automatizados, garantindo que tudo esteja ok, o kubernetes entra em ação gerenciando o formato de atualização da aplicação que foi atualizada, pois os containers são conectados no GCV e ele implementa a atualização um a um, checando se o status dela está “up” a partir das métricas já estabelecidas, após todas as máquinas estarem “up”, o GCV garante que o deploy foi feito em vários serviços.

Por controlar os containers, o Gerente de ciclo de vida consegue olhar para os containers filhos e identificar possíveis erros, realizando ações já programadas de falha, como reiniciar o container ou voltar para uma versão antiga.

Assim como no dimensionamento, o GCV consegue analisar todos os status de cada containers, como requisições recebidas, uso de CPU, memória, assim podendo redirecionar as requisições para containers mais vazios, distribuindo a carga recebida. Quando é necessário, ele também pode replicar os containers para aumentar o processamento em momentos de pico de determinados serviços.

Então, em grandes projetos onde já se espera grandes quantidades de acesso, o uso de um Gerente de Ciclo de Vida é essencial tanto para aplicar conceitos de CI/CD como para manter sua aplicação sempre em pé, independente de erros que ocorram ou de picos extremos de acesso.

Conclusão

Como foi visto, utilizar dimensionamento automático, principalmente em arquiteturas baseadas em microsserviços, trazem grandes vantagens. No entanto, é importante analisar cada negócio e entender as vantagens e desvantagens que esse método pode trazer. Além disso, escolher as melhores ferramentas e técnicas que são essenciais para mitigar custos e complexidades desnecessárias.