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.
- Explicar o que é computação como recurso de nuvem cobrado por uso
- Escolher uma família de máquina virtual adequada para um perfil de carga de trabalho
- Diferenciar escalonamento vertical de escalonamento horizontal como 2 respostas diferentes para a falta de capacidade
- 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ília | Otimizada para | Uso típico |
|---|---|---|
| Propósito geral | Equilíbrio entre computação, memória e rede | Servidores web, bancos de dados pequenos a médios, ambientes de desenvolvimento |
| Otimizada para computação | Processadores de alto desempenho, mais vCPU por GB de memória | Processamento em lote, transcodificação de mídia, servidores de jogos |
| Otimizada para memória | Grande quantidade de RAM em relação à vCPU | Bancos de dados em memória, análises em tempo real |
| Otimizada para armazenamento | Alto throughput de disco local com baixa latência | Bancos de dados de alto throughput, processamento de dados em stream |
| Computação acelerada | GPUs ou outros aceleradores de hardware | Treinamento 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ção | O que você gerencia | Inicialização típica |
|---|---|---|
| Máquina virtual | SO, runtime, escalonamento | Minutos |
| Computação gerenciada | Código e configuração da aplicação | Minutos |
| Contêiner | Aplicação e suas dependências de runtime, empacotadas juntas | Segundos |
| Função serverless | Só o código da função | Milissegundos |
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.
