Containers e serverless são duas opções para deploy de microsserviços, a arquitetura usada em aplicações modernas. Microsserviços oferecem a agilidade e o desempenho necessários nas aplicações de hoje e são otimizadas para o cloud. Assim, são cruciais para o crescimento e a preparação das empresas para o futuro, enquanto implementações de infraestrutura de edge e 5G se tornam cada vez mais predominantes.
Além disso, a adoção do cloud desempenhou um papel fundamental na adaptação ao aumento do trabalho remoto e das compras online devido à pandemia de Covid-19, tornando arquiteturas de cloud, como containers e serverless, mais importantes do que nunca para empresas contemporâneas.
Este post discutirá as similaridades das duas arquiteturas, suas características definidoras e como elas podem ser comparadas em termos de custo, uso de recursos, desempenho, entre outros.
Semelhanças entre serverless e containers
Apesar de containers e serverless poderem ser usados juntos, eles são mais discutidos como opções opostas para fragmentar aplicações monolíticas e construir aplicações de microsserviços nativos de cloud. No entanto, serverless e containers têm mais em comum do que seu uso em arquiteturas distribuídas. Um artigo de 2019 da New Stack resume bem outras semelhanças importantes entre as funções de containers e serverless:
- foram projetados para tarefas pequenas e independentes;
- podem ser implementados em segundos;
- usam APIs para se integrar com recursos externos;
- não têm armazenamento de longa duração; e
- podem ser usados para construir infraestruturas imutáveis.
No entanto, a despeito dessas semelhanças, desenvolvedores que debatem entre as duas opções para arquitetura de microsserviços deveriam considerar os conceitos separadamente para realmente entender seus respectivos benefícios e desvantagens.
O que são containers?
Definição
Containers são unidades de software que guardam código com suas dependências subjacentes para que possam ser movidas de um ambiente computacional para outro sem afetar sua execução. containers são similares a VMs no sentido de oferecerem uma forma de isolar aplicações que rodam em um mesmo host. No entanto, diferentemente de VMs, em que cada um contém seu próprio sistema operacional, containers compartilham o mesmo kernel do sistema operacional, resultando em uma unidade mais leve, que usa menos recursos e inicializa mais rapidamente.
Tecnologias relacionadas
Quando falamos de containers, duas ferramentas de código aberto, de tão onipresentes, são quase sinônimos de arquitetura de container: Docker e Kubernetes.
Docker é uma plataforma para construir contêiner de código aberto adotado em larga escala e considerado um padrão da área. Segundo o site oficial, o Docker Engine cria “uma abordagem universal de pacotes que embrulha todas as dependências da aplicação dentro de um contêiner que roda no Docker Engine”. Os containers do Docker estão disponíveis tanto para aplicações de Windows quanto de Linux e são programados para garantir que aplicações em containers sempre rodem do mesmo jeito, qualquer que seja a infraestrutura.
O Kubernetes é outra ferramenta de código aberto para containers. Porém, diferentemente da plataforma Docker, tem um foco muito claro: orquestração. Já que microsserviços são muito mais complexos que aplicações monolíticas, a gestão do seu dia a dia acaba se envolvendo muito mais. O Kubernetes permite a automatização de aspectos da implementação, da escalabilidade e de outras tarefas a fim de reduzir o fardo operacional de gerir containers.
O que é serverless?
Definição e características
Serverless usa um modelo pay-as-you-go de rodar aplicações distribuídas em servidores geridos por provedores serverless. Diferentemente de containers – que são dedicados a máquinas específicas e empacotados com porções individuais de CPU, memórias e outros recursos que devem ser provisionados com antecedência –, funções serverless executam quando e onde são necessárias, em resposta a eventos pré-programados, como mudança no banco de dados ou requisição HTTP. Dessa forma, eles escalam automaticamente, permitindo às empresas pagarem pelos recursos com base no consumo.
Um artigo de 2019 da Thoughtworks descreve os seis traços do serverless:
- baixo barrier-to-entry: gestão de servidor não é necessária e é fácil de programar e rodar, o que acelera o processo de venda;
- hostless: não é dedicado a uma hospedagem ou servidores específicos;
- stateless: funções são efêmeras, então nada fica guardado na memória;
- elasticidade: aumenta e diminui de escala automaticamente;
- distribuído: unidades de implementação são pequenas e distribuídas por padrão; e
- event-driven: desencadeado por eventos e vagamente acoplado.
Origens e business driver
Uma das discussões mais remotas acerca do serverless vem de um artigo de 2012 escrito por Ken Fromm, Why the Future of Software and Apps is Serverless (“Por que o futuro do software e dos apps é serverless”). Nele, Fromm apresenta as tendências que levam à adoção de serverless, incluindo o crescimento do cloud computing e arquiteturas distribuídas. Fromm observa que “Desenvolvedores que trabalham em um mundo distribuído são forçados a traduzir as coisas que fazem em conjuntos de servidores. Sua visão de mundo está cada vez mais envolta de tarefas e fluxos de processos, não aplicações e servidores – e suas unidades de medidas de ciclos computados é em segundos ou minutos, não horas”.
Além do fator cloud computing, microsserviços e backend-como-serviço, a Forbes lista outras duas tendências que conduzem à adoção de serverless no momento. Primeiro, percebe um aumento no uso de APIs, que são usados em arquitetura serverless como um elemento que une as coisas. Também notam uma mudança na forma como as equipes são organizadas enquanto empresas fazem a transição em direção à integração e desenvolvimento contínuo (CI/CD), resultando em equipes de DevOps que criam pontes entre operações e desenvolvimento. Com serverless, aponta a Forbes, essa tendência vai mais além: “Exceto poucas linhas de código, nem desenvolvedores nem operações precisam gerir, configurar, arrumar ou otimizar nada.”
Conceitos relacionados
Como serverless surgiu, em parte, como resultado de uma tendência cada vez maior em direção à infraestrutura gerenciada, a arquitetura é frequentemente confundida com outros modelos de cloud que oferecem serviços geridos, tais como:
- PaaS: platform-as-a-service oferece ferramentas de software, infraestrutura e sistemas operacionais. Isso é parecido com serverless compute, no sentido de que desenvolvedores só precisam escrever o código da aplicação; mas, com o PaaS, aplicações não são efêmeras e ainda precisam de servidores dedicados para mantê-los sempre funcionando, os quais devem ser provisionados pelo cliente.
- IaaS: infrastructure-as-a-service oferece recursos computacionais automatizados e escaláveis, mas os sistemas operacionais e os bancos de dados não são geridos pelo provedor. Isso é diferente de serverless compute, onde as funções são stateless e o provedor fornece tudo, menos o código da aplicação.
- SaaS: software-as-a-service se refere a licenciar software out-of-the-box pela Internet. Nesse caso, o provedor gere tudo, desde a infraestrutura que dá suporte à aplicação até a aplicação em si.
Comparando serverless e containers
Apesar de serverless e containers compartilharem muitos dos mesmo benefícios, como implementação rápida, suporte para CI/CD e aptidão para cloud, há diferenças notáveis no uso de seus recursos, custos, segurança, desempenho e agilidade. Considerando cada uma dessas métricas separadamente, entenderemos melhor os prós e contras de cada modelo.
Usos de recursos
Quando comparado com serverless, que pode escalar automaticamente, containers usam consideravelmente mais recursos. Até com ferramentas de orquestração como Kubernetes, empresas precisam decidir entre provisionar de mais ou de menos (em outras palavras, entre custo e performance). Na verdade, um estudo de 2020 da Datadog descobriu que mais de 45% das empresas usam menos de 30% de CPU e memória requisitados.
Além disso, as funções de serverless são menores que containers. Já que não vêm com dependências, mas compartilham recursos com outras funcionalidades (um modelo conhecido como multitenant), computação serverless permite uso de recursos mais eficiente que containers.
Custo
Uma das maiores diferenças entre serverless e containers é a forma como é cobrada. Enquanto serverless é pay-as-you-go, empresas que usam containers pagam pelo recurso com antecedência. Isso significa que serverless implica menos custos antecipados, outra razão que facilita a sua entrada.
Como discutido acima, serverless também pode reduzir o custo operacional lá na frente, tanto pelo uso eficiente de recursos quanto pela economia de tempo com gestão de recursos – particularmente para tarefas com workloads irregulares. No entanto, mudar de escala automaticamente pode dificultar o provisionamento de custos. Soluções serverless que não oferecem soluções para monitorar ou limitar taxas podem levar a cobranças altas, particularmente em casos de tráfego malicioso, como ataques de força bruta.
Desempenho
containers executam o tempo todo, fazendo com que sejam melhores para processos longos. No entanto, para processos mais curtos e workloads irregulares, podem gastar recursos intensamente e ser dispendioso. Como resultado, ferramentas de orquestração com Kubernetes tiram containers do ar depois de períodos de inatividade, resultando em atrasos de vários segundos, conhecido como “cold start”, quando voltam a se conectar.
Já que usuários costumam abandonar sites em razão de baixa performance, esses poucos segundos podem ser cruciais para conversões e vendas no varejo online. Para aplicações de baixa latência e de missão crítica que requerem desempenho rápido e confiável, um atraso longo e imprevisível é inaceitável.
Segurança
Devido ao fato de provedores servelerss gerenciarem a segurança do back-end para seus clientes, clientes serverless são responsáveis apenas por assegurar o front-end de suas aplicações. Nesse sentido, clientes serverless têm menos vetores de ataque de quem se resguardar do que se suas aplicações executassem em containers.
No entanto, as propriedades de isolamento de containers oferecem um grau de segurança que não está presente na arquitetura multitenant do serverless. Assim, provedores serverless que não tratam de isolar as aplicações de seus clientes colocam estes em risco.
Agilidade
Tanto serverless quanto containers são muito mais ágeis que aplicações legadas, já que permitem CI/CD, implementação rápida e mais elasticidade. No entanto, a simplicidade de trabalhar com serverless – característica conhecida como “low barrier to entry” – facilita o desenvolvimento de aplicações, resultando em menos tempo para lançá-las no mercado.
Além disso, a arquitetura serverless escala automaticamente – apesar de termos de observar que algumas soluções de serverless compute, como o AWS Lambda, rodam dentro de containers e requerem que os clientes distribua memória para cada função, necessitando de provisionamento e adivinhação para escalar.
No entanto, a portabilidade pode ser um problema para clientes serverless. Empresas de cloud que acoplam funções a outros serviços colocam clientes em risco de vendor lock-in. Uma vez que o serverless oferece aos clientes menos controle sobre suas ferramentas e linguagens de programação, mudar de provedor pode ser impossível sem reescrever códigos.
Conclusão
Com escalabilidade automática, implementação rápida, facilidade de entrada, uso eficiente de recursos, alta performance e bom custo-benefício, serverless é a solução ideal para:
- workloads irregulares;
- processos simples e curtos;
- aplicações de baixa latência e IoTs;
- reduzir custos operacionais;
- lançar novas features rapidamente; e
- desmembrar aplicações monolíticas.
Além disso, o Edge Functions, produto da Azion para construção de funções serverless no Edge, lida com muitos dos desafios dessa arquitetura. Em vez de executar funções serverless em containers, como AWS Lambda e outros provedores cloud, o Edge Functions combina segurança e performance ao executar códigos em um ambiente multitenant, onde cada função é isolada em um sandbox seguro usando V8 Isolate.
Os produtos da Azion são construídos com padrões abertos para evitar vendor lock-in e permitir que clientes façam a transação facilmente entre nossas plataformas e outros provedores. Por fim, o Edge Functions permite monitoramento por meio do Real Time Metrics e pode ser configurado para registrar o uso ou configurar limites de taxas para evitar contas altas e inesperadas e garantir que as funções não escalem descontroladamente.
No próximo post desta série, discutiremos as melhores práticas para aplicações serverless, incluindo casos de uso ideais, práticas de desenvolvimento e como encontrar seu provedor serverless.