Utilização de containers de aplicação em Cloud Computing

blue-sky-196230_1920

Como já foi abordado anteriormente neste blog, o conceito de Cloud Computing é algo que ganha cada vez mais espaço no mercado de TI. Já citamos anteriormente alguns conceitos e vantagens proporcionados pelo Cloud Computing, bem como um exemplo e pontos a serem considerados na migração de um sistema legado para o Microsoft Azure, que é uma das plataformas em nuvem mais consolidadas atualmente.
Um dos avanços trazidos pela Cloud Computing está na escalabilidade e flexibilidade conseguida na hospedagem e execução de aplicações. Três mecanismos de hospedagem das plataformas em nuvem se destacam nesse cenário: máquinas virtuais, serviços de nuvem e, mais recentemente, containers de aplicação.

Vamos começar falando das máquinas virtuais, que é base para os outros dois mecanismos citados. Em Cloud Computing, a máquina virtual nada mais é do que a partição de um servidor na nuvem, que provê toda a estrutura operacional para a hospedagem e execução de uma aplicação, mantendo-a ao mesmo tempo isolada do sistema operacional do seu hospedeiro. Neste sentido, as máquinas virtuais trouxeram avanços na segurança e flexibilidade de configuração de aplicações. Por outro lado, elas ainda mantêm a necessidade de um trabalho de administração muito grande para o responsável pela aplicação e, desse modo, ainda ficam devendo em facilidade de gerenciamento e na agilidade de execução das mesmas.
Para trazer maiores ganhos nestes quesitos, existem os serviços de nuvem, que utilizam um conceito conhecido como PaaS (Platform as a Service). Num serviço de nuvem é possível hospedar e gerenciar diferentes processos de uma mesma aplicação, os quais são conhecidos como web roles e worker roles. Ambas são gerenciadas de maneira semelhante pela plataforma, com a diferença básica de que uma web role executa em um servidor Web (IIS, no caso do Windows Azure) e responde somente a requisições de usuários externos à aplicação. Para executar cada role, o serviço de nuvem instancia uma ou mais máquinas virtuais. É possível configurar o tamanho da máquina virtual de cada role, de modo a atender as diferentes necessidades de processamento que as diferentes roles podem vir a ter. Além disso, é possível configurá-las para terem mecanismo de autoescala até um número máximo de instâncias de máquinas virtuais. Em outras palavras, é possível instanciar uma nova máquina virtual para uma role quando as demais instâncias que a atendem atingem o seu limite de processamento, até que um número máximo de instâncias seja atingido. Logo, se tira em parte o trabalho de administração para o responsável pela aplicação, trazendo mais agilidade em sua execução e facilidade em seu gerenciamento.
Outro mecanismo que pode ser utilizado em Cloud Computing é o de containers de aplicação. Eles consistem de regiões isoladas do restante da máquina hospedeira (seja ela física ou virtual), que podem prover os recursos operacionais necessários para hospedar um processo ou uma aplicação. Vários containers podem ser instanciados dentro de uma mesma máquina virtual e o isolamento garante que cada aplicação não tenha acesso, nem seja acessada por nada fora do seu container hospedeiro. Trazendo para o contexto de Cloud Computing, embora o uso de containers de aplicação não tenha nenhuma relação com o uso de serviços de nuvem, é possível fazer uma analogia do primeiro com a hipotética ação de hospedar e executar várias roles de um serviço de nuvem dentro da mesma instância de uma máquina virtual. As primeiras ferramentas a surgirem voltadas para a utilização de containers de aplicação foram voltadas para a utilização em máquinas virtuais com sistema operacional Linux, sendo o Docker a principal delas. Recentemente, a Microsoft também lançou a sua, visando principalmente a utilização no Microsoft Azure. Sua difusão, porém, ainda não chegou perto da alcançada pelo Docker.

 

Um estudo de caso

Há cerca de 2 anos, uma empresa de gestão de ativos, em parceria com a dti digital technologies, iniciou o desenvolvimento de um projeto de inovação. Um dos requisitos do mesmo foi a hospedagem total da aplicação a ser desenvolvida em uma plataforma na nuvem (até então, algo inédito na empresa). A plataforma escolhida foi o Windows Azure.
Desenhada a arquitetura da aplicação, verificou-se a necessidade de uma interface de interação com usuários externos, além de vários processos internos para processamento dos dados entre diferentes camadas desenhadas para o sistema. Na época, containers de aplicação ainda engatinhavam no mercado, por isso, a escolha final foi pela utilização de serviços de nuvem. Como a utilização de um único serviço de nuvem para todos os processos implicaria no fato de um único deploy impactar toda a aplicação, decidiu-se pelo seguinte agrupamento de processos em diferentes serviços de nuvem:

Um serviço de nuvem contendo somente uma web role correspondente à interface Web;
Um serviço de nuvem contendo algumas worker roles com funcionamento semelhante a gateways;
Um serviço de nuvem contendo as demais worker roles do sistema;

Numa análise inicial, foram definidos tamanhos de máquina virtual e número máximo de instâncias de cada worker role, mas à medida que o sistema foi sendo mais utilizado, verificou-se a necessidade de mudança de algumas destas configurações iniciais, o que foi feito sem grandes dificuldades.
Mais recentemente, porém, foi detectada uma limitação desta estrutura, que poderia ser corrigida a partir da utilização de containers de aplicação (se a arquitetura da aplicação fosse desenhada nos dias de hoje, provavelmente esta teria sido a escolha para o projeto). Mesmo configuradas para instanciar somente uma máquina virtual do menor tamanho disponível no Microsoft Azure, algumas roles consumiam, durante a maior parte do tempo, menos de 10% do processamento disponível na máquina. Ou seja, havia mais de 90% de processamento sendo literalmente desperdiçado nessas roles, já que a cobrança não é feita por taxa de processamento, mas sim por máquina virtual instanciada. Enquanto isso, outras roles operavam próximas do seu limite de processamento, mesmo com várias máquinas virtuais instanciadas.
Este problema diminuiria significativamente com a utilização dos containers de aplicação, já que vários dos processos poderiam ser executados numa mesma máquina virtual. Isso representa, não só uma diminuição drástica nos custos desse projeto em específico, mas também uma tendência para todo o mercado: processamentos cada vez menos sobrecarregados e roles cada vez mais rápidas e eficientes.

 
Por: Bruno Bazzoni
Revisão: Dandara Chaves

Deixe um comentário