Fundamentos da computação em nuvem

Serviços de computação

As opções reais de computação por trás de IaaS e PaaS: como as máquinas virtuais são dimensionadas e precificadas, o que as plataformas de computação gerenciada tiram das suas costas, e onde contêineres e funções serverless ficam no mesmo espectro.

Iniciante 17 minutos 4 Objetivos de aprendizado
  1. Explicar o que é computação como recurso de nuvem cobrado por uso
  2. Escolher uma família de máquina virtual adequada para um perfil de carga de trabalho
  3. Diferenciar escalonamento vertical de escalonamento horizontal como 2 respostas diferentes para a falta de capacidade
  4. Posicionar máquinas virtuais, computação gerenciada, contêineres e funções serverless em um único espectro de controle versus conveniência

O que você está de fato alugando

O tema anterior mostrou que a IaaS entrega uma máquina virtual e a PaaS entrega uma plataforma que roda o seu código. Nenhum dos 2 explicou o que está acontecendo dentro dessa caixa: uma certa quantidade de CPU e memória, sentada em um data center, que você aluga por hora, por segundo ou por requisição. Esse recurso é computação, e quanto dela você recebe, como ela é empacotada e como você paga por ela moldam quase toda outra decisão que você toma em uma plataforma de nuvem.

Máquinas virtuais: a unidade básica

A máquina virtual continua sendo a forma mais comum de vender computação, e os provedores agrupam suas ofertas de VM em famílias construídas em torno de proporções diferentes de recursos.

FamíliaOtimizada paraUso típico
Propósito geralEquilíbrio entre computação, memória e redeServidores web, bancos de dados pequenos a médios, ambientes de desenvolvimento
Otimizada para computaçãoProcessadores de alto desempenho, mais vCPU por GB de memóriaProcessamento em lote, transcodificação de mídia, servidores de jogos
Otimizada para memóriaGrande quantidade de RAM em relação à vCPUBancos de dados em memória, análises em tempo real
Otimizada para armazenamentoAlto throughput de disco local com baixa latênciaBancos de dados de alto throughput, processamento de dados em stream
Computação aceleradaGPUs ou outros aceleradores de hardwareTreinamento de machine learning, renderização gráfica

Um job em lote que passa o tempo fazendo cálculos de ponto flutuante e mal toca em memória pertence à família otimizada para computação, não à propósito geral. Um banco de dados que mantém um grande volume de trabalho em memória pertence à otimizada para memória. Escolher a família errada não desperdiça só dinheiro, pode deixar uma carga faminta exatamente do recurso que ela precisava.

Os tamanhos de instância dentro de uma família seguem um padrão de dobra: um large sobe para xlarge, que sobe para 2xlarge, dobrando aproximadamente vCPUs e memória a cada passo. Você viu na lição de IaaS que uma t3.micro, com 2 vCPUs e 1 GiB de memória, custa cerca de US$ 7,59 por mês antes do armazenamento. Subir um tamanho aproximadamente dobra os recursos e a conta; mudar de família em um tamanho parecido muda a proporção de recursos em vez disso.

Escalonamento vertical versus escalonamento horizontal

Imagine essa mesma aplicação começando a dar timeout sob carga. Uma olhada rápida nas métricas mostra a CPU travada em 100% enquanto o uso de memória continua baixo. Existem 2 formas diferentes de reagir, e elas não são intercambiáveis.

Escalonamento vertical redimensiona a instância existente para uma maior, com mais vCPUs, mais memória, a mesma máquina única. É simples, mas tem um teto (o maior tipo de instância disponível na família) e interrompe brevemente a instância durante o redimensionamento.

Escalonamento horizontal adiciona mais instâncias do mesmo tamanho e distribui a carga entre todas elas, tipicamente atrás de um load balancer. Evita o teto e não exige downtime nas instâncias existentes, mas só funciona se a aplicação conseguir de fato dividir o trabalho entre várias máquinas em vez de depender de uma só.

Para a aplicação travada em CPU mas tranquila em memória do exemplo acima, os 2 caminhos resolvem o sintoma. Qual deles um time real escolhe depende de a aplicação ter sido construída para rodar em mais de uma instância ao mesmo tempo, uma questão de design, não de computação, mas que as opções de computação forçam você a enfrentar.

Computação gerenciada: alguém opera a frota por você

Você já conheceu o AWS Elastic Beanstalk, o Google App Engine e produtos parecidos como exemplos de PaaS. Por baixo, eles continuam rodando o seu código em máquinas virtuais; a diferença está em quem provisiona e opera essas máquinas. Uma plataforma de computação gerenciada assume o lançamento de instâncias, a implantação de novas versões do seu código e, na maioria dos casos, o escalonamento da frota conforme o tráfego muda. Você ainda escolhe o runtime e entrega a aplicação; você para de escrever os scripts que provisionariam e cuidariam das instâncias na mão.

O espectro completo de computação

Máquinas virtuais e computação gerenciada são 2 pontos numa linha mais longa. Contêineres e funções serverless ficam mais adiante nela, e este domínio dedica uma lição completa a cada um mais à frente. Por enquanto, o formato do espectro inteiro importa mais do que a mecânica de qualquer ponto isolado nele.

OpçãoO que você gerenciaInicialização típica
Máquina virtualSO, runtime, escalonamentoMinutos
Computação gerenciadaCódigo e configuração da aplicaçãoMinutos
ContêinerAplicação e suas dependências de runtime, empacotadas juntasSegundos
Função serverlessSó o código da funçãoMilissegundos

Um contêiner compartilha o kernel do sistema operacional do host em vez de rodar um SO convidado completo como faz uma máquina virtual, e é exatamente por isso que ele inicia em segundos em vez de minutos. Uma função serverless, como uma função AWS Lambda, vai ainda mais longe: o provedor gerencia todo o ambiente de execução, e você é cobrado por requisição e por fração de segundo que a função realmente roda, não por tempo ocioso entre invocações.

A armadilha: "serverless é sempre mais barato"

É tentador supor que pagar só pelo que você usa sempre vence pagar por uma máquina parada. Isso é verdade para tráfego com picos ou de baixo volume, em que uma pequena máquina virtual sempre ligada passaria a maior parte do tempo ociosa e cobrada mesmo assim. Rode uma carga em volume alto e constante, e a conta se inverte: as cobranças por invocação em uma função serverless podem somar mais do que uma instância modesta sempre ligada custaria pelo mesmo trabalho total. Nenhuma ponta do espectro é mais barata em todo caso. O padrão de tráfego decide, e é exatamente por isso que a comparação completa espera por uma lição própria mais adiante neste domínio.

Onde isso deixa você

Toda opção de computação neste espectro responde à mesma pergunta de fundo: quanto do trabalho de operar e escalar você quer manter versus entregar ao provedor, ao custo de quanto controle. Máquinas virtuais mantêm o máximo nas suas mãos; funções serverless mantêm o mínimo. A próxima lição deixa a computação para trás e cobre o que acontece com os dados que esses recursos de computação leem e escrevem: armazenamento.