Containers vs. Serveless
Published: 2021-10-13 20:02:01

## O que são containers
<p>Um contêiner é um pacote leve, autônomo e executável de um software que inclui tudo o que é necessário para executá-lo: código, tempo de execução, ferramentas do sistema, bibliotecas do sistema e configurações. Eles podem ser executados em qualquer lugar em um único pacote, de forma rápida, consistente e confiável, independentemente do ambiente de implantação.</p>

<p>Como os contêineres compartilham recursos do sistema com o servidor host em vez de emular um sistema operacional virtual, eles são mais eficientes do que as máquinas virtuais. Ao isolar um aplicativo do ambiente de host externo, os contêineres permitem a implantação de aplicativos sem conflitos.</p>

<p>Os contêineres corrigem o problema de execução do software quando ele é movido de um único ambiente de computação, essencialmente, isolando-o do ambiente, possibilitando mover aplicativos em contêineres facilmente entre hosts.</p>

<p>Qualquer tipo de aplicativo pode ser executado em um contêiner. Um aplicativo em contêiner será executado da mesma maneira, não importa onde esteja hospedado. Os contêineres podem ser facilmente movidos e implantados onde necessário independentemente de seu conteúdo.</p>

## O que é serveless
<p>Serveless não significa que não haja servidores envolvidos. Serverless é um serviço de computação baseado em nuvem e, assim como tudo na nuvem, ele é executado em servidores. Portanto, sua experiência é sem servidor, mesmo que a infraestrutura subjacente não seja.</p>

<p>Serveless é uma arquitetura de execução na qual o código do aplicativo é executado sob demanda. Da perspectiva do usuário, o único trabalho necessário para executar o código é carregá-lo e acionar quando ele deve ser executado. É por isso que é chamado de sem servidor - não há servidor para manter.</p>

<p>Os aplicativos serveless são hospedados por um fornecedor terceirizado que cobra apenas com base no tempo de execução de cada função. O provedor de nuvem gerencia dinamicamente a alocação de recursos da máquina. Serverless permite escrever e implantar código sem o incômodo de gerenciar a infraestrutura subjacente, o que aumenta a produtividade do desenvolvedor. Você está abstraindo totalmente a infraestrutura.</p>

<p>Todo o aplicativo ou parte de um aplicativo é dividido em várias funções, cada uma das quais é acionada em resposta a um evento como uma solicitação HTTP, a chegada de uma nova mensagem na fila de mensagens ou o salvamento ou modificação de um novo objeto no armazenamento. É possível executar essas funções em um determinado momento ou periodicamente, um recurso que é útil para tarefas cron.</p>

<p>Serveless é ótimo se você tiver picos repentinos de tráfego que precisam ser detectados e tratados instantaneamente. O aplicativo é totalmente encerrado se não houver tráfego. Você paga apenas pelos recursos que usa. Sem uso, sem custos.</p>

<p><strong>Serveless é muito adequada para uma variedade de tarefas, mas está longe de ser um substituto completo para implantar e gerenciar seus próprios contêineres. Serveless é projetado para funcionar em conjunto com os contêineres, em vez de substituí-los.</strong></p>

## O que essas tecnologias tem em comum?
<p>Permitem que os desenvolvedores se concentrem em seu código em vez de na infraestrutura. Isso aumenta a velocidade de desenvolvimento.</p> 

<p>Ambos são perfeitamente adequados para microsserviços e arquiteturas baseadas em componentes. Ao usá-los, a implantação e o escalonamento costumam ser mais rápidos e econômicos do que na arquitetura monolítica clássica, porque você está manipulando pequenas partes do aplicativo em vez de tudo.</p>

<p>Apesar dessas semelhanças, cada tecnologia tem suas próprias vantagens, desvantagens e casos de uso.</p>

![Image comparativo container e serveless](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/egl8yvf5azq5l31s9nmu.png)

## Prós Containers
- A principal vantagem de um contêiner é que você pode combinar o aplicativo e todas as suas dependências em um pequeno pacote organizado e executá-lo em qualquer lugar. Isso fornece um nível sem precedentes de flexibilidade e portabilidade e permite que você continue sendo um provedor agnóstico baseado em nuvem.
- Os contêineres podem ser executados em qualquer servidor Linux moderno, bem como em certas versões do Windows.
- As soluções baseadas em contêiner podem ser facilmente transferidas entre provedores de nuvem.
- Você pode configurar seu próprio ambiente de host local ou usar um serviço de nuvem pública como ECS.
- Você pode colocar em contêineres um aplicativo escrito em qualquer tipo de linguagem.
- Os contêineres podem funcionar pelo tempo que você precisar.
- No ecossistema de containers, existem ferramentas abrangentes para a análise de containers.
- Você pode gerenciar todos os recursos, definir todas as políticas, monitorar a segurança e determinar como seu aplicativo é implementado e como se comporta. Você pode depurar e monitorar como quiser. Este não é o caso do serveless pois tudo é gerenciado pelo seu provedor de nuvem.
- Os contêineres de sua equipe terão o mesmo ambiente de desenvolvimento, independentemente do sistema operacional usado. Isso torna incrivelmente fácil para equipes maiores serem eficientes.
- Crucial para qualquer aplicativo empresarial, os contêineres permitem testes e depuração abrangentes, bem como monitoramento de desempenho. Os microserviços podem ser ajustados para atender aos requisitos de desempenho do sistema subjacente. Com total controle sobre o ambiente do contêiner, vem todo o poder para observar o que acontece dentro e fora dos contêineres. Isso permite depuração e teste eficazes e abrangentes, usando uma gama completa de recursos, bem como monitoramento de desempenho em profundidade em todos os níveis.
- A tecnologia de contêiner permite que você torne seus aplicativos tão grandes quanto desejar.

## Contra Containers
- Você precisa saber mais sobre o ambiente e os diferentes recursos ao seu alcance. É uma curva de aprendizado íngreme para todos, porque basicamente você é quem implanta e gerencia o programa.
- Usar contêineres significa que você não terá escalonamento automático. É algo que você precisa configurar sozinho. Felizmente, ferramentas específicas do fornecedor, como AWS Auto Scaling, tornam isso mais fácil.
- Os contêineres também podem ser dimensionados de acordo com a demanda. Em contraste com o serveless, o dimensionamento do contêiner é de responsabilidade do usuário.
- O Kubernetes normalmente é escalonado de acordo com o uso de CPU ou memória. Em arquiteturas baseadas em eventos, o Kubernetes costuma reagir tarde demais, pois o número de mensagens pendentes na fila não afeta o escalonamento. Esse problema pode ser contornada com um sistema de observabilidade das filas e ativando triggers para escalonar um serviço.


## Prós Serveless
- Você nunca paga pelo tempo ocioso de suas funções, portanto, se não houver tráfego, não haverá cobrança na sua fatura mensal. Quase todos os provedores sem servidor têm níveis gratuitos, que incluem uma quantidade fixa mensal de solicitações e tempo de execução. Normalmente, o volume fornecido é mais do que suficiente para que um pequeno site ou startup opere gratuitamente.
- A escalabilidade é o ponto forte do serverless. As funções sem servidor são dimensionadas automaticamente conforme necessário de acordo com a demanda, sendo que o dimensionamento é realizado inteiramente pelos provedores de nuvem. Isso economiza esforço administrativo e reduz a complexidade. 
- As tecnologias serveless podem ser escalonadas de zero à carga de pico. Para um grande número de eventos, o provedor de nuvem garante que as funções serveless sejam dimensionadas rapidamente para lidar com os eventos. Isso torna os aplicativos serveless particularmente adequados para arquiteturas baseadas em eventos e aplicativos de negócios com picos de carga.
- Você não precisa gerenciar nenhuma infraestrutura. Não há atualizações do sistema operacional para instalar, nem patches de segurança, o provedor cuida disso para você.
- Ajudam a reduzir o tempo de desenvolvimento e a colocar seus produtos no mercado com mais rapidez. Se você não tem que se concentrar em sua infraestrutura, então você pode gastar seu tempo construindo o melhor produto possível.

## Contra Serveless
- O serverless é executado em plataformas de host específicas, muitas das quais são baseadas na nuvem pública (como AWS Lambda ou Azure Functions).
- As estruturas serveless suportam um número limitado de linguagens que variam de plataforma para plataforma.
-  A maioria das plataformas serveless são projetada para suportar cargas de trabalho stateless. No entanto você pode se conectar a serviços de armazenamento externo (como S3 no AWS), as funções (Lambdas) em si não podem ter estado. Isso traz novos requisitos de segurança para os dados.
-  As funções serveless são projetadas para serem executadas por um curto período antes de serem encerradas.
-  Não podem ser migradas facilmente entre provedores de nuvem. Isso se deve à implementação específica do provedor de nuvem de produtos sem servidor, como AWS Lambda e Azure Functions. Por exemplo, para migrar uma função AWS Lambda para uma função do Azure, os gatilhos (por exemplo, gatilhos HTTP, gatilhos de fila, gatilhos de banco de dados) teriam que ser reescritos.
-  Como os servidores permanecem frios antes que um aplicativo faça ping neles, há uma certa latência envolvida na execução de tarefas. Para aplicativos em que a velocidade é fundamental, como e-commerce e páginas de pesquisa, o serveless pode não ser a solução ideal.
-  O tempo de execução é gerenciado pelo provedor de nuvem, o que representa desafios adicionais na análise de desempenho. Sem a capacidade de instalar agentes para recuperar métricas diretamente do tempo de execução, deve-se confiar totalmente nos recursos das plataformas em nuvem.
- Aplicativos complexos podem ser difíceis de construir usando uma arquitetura serveless. Você terá que fazer muita coordenação e gerenciar dependências entre todas as funções sem servidor, o que pode ser uma tarefa difícil para aplicativos grandes e complicados.
- Observabilidade, monitoramento e depuração não são fáceis de fazer com a abordagem serveless. 

## Casos de uso serveless vs. contêiner

Os contêineres são ideais para situações em que você precisa:

- Suportar aplicativos mais complexos e de longa execução, onde você precisa de um alto nível de controle ambiental e tem os recursos para configurar e manter o aplicativo.
- Manter a paridade do ambiente à medida que o código do sistema desce na cadeia de entrega (CI/CD). 
- Mover aplicativos rapidamente entre diferentes servidores host.
- Manter a capacidade de mover cargas de trabalho entre o local e a nuvem.
- Disponibilizar serviços de forma contínua.
- Quando precisar de flexibilidade e controle total do seu sistema ou quando precisar migrar serviços legados.
- Construir uma solução que interaja com fornecedores e/ou bibliotecas terceiras, que dependam de diferentes protocolos ou exija linguagens específicas para desenvolvimento.
- São perfeitos para um aplicativo ou um grande site de comércio eletrônico. Um site como este contém muitas partes, como listas de produtos, processamento de pagamentos, gerenciamento de estoque e muito mais. Você pode usar contêineres para empacotar qualquer um desses serviços sem se preocupar com limites de tempo ou problemas de memória.

Enquanto isso, serveless é ótimo quando você deseja:

- Quando você precisa de velocidade de desenvolvimento mais rápida, escalonamento automático e custos de tempo de execução drasticamente menores.
- Executar o código que consome muitos recursos rapidamente, de forma pontual.
- Executar quantidades finitas de código de aplicativo na nuvem sem ter que configurar um servidor virtual ou pagar por recursos de nuvem contínuos.
- Serveless é melhor usado para aplicativos que precisam ser capazes de realizar tarefas, mas não necessariamente precisam ser executados. Por exemplo, serveless é uma ótima opção para um aplicativo de Internet das Coisas (IoT) que detecta a presença de água para detectar vazamentos em uma instalação de armazenamento de água. O aplicativo não precisa ser executado o tempo todo, mas precisa estar pronto para agir em caso de vazamento.

<p>Como pode ser observado, ambas estruturas possuem fortes pontos positivos e são totalmente complementares permitindo que arquiteturas possam utilizar o melhor dos dois mundos, coexistindo serverless e containeres na solução de diferentes problemas computacionais</p>

## Referências
- https://www.sumologic.com/blog/serverless-vs-containers/
- https://medium.com/devops-dudes/containers-vs-serverless-which-one-you-should-choose-in-2020-38b1a0fa2b8a
- https://www.extremenetworks.com/extreme-networks-blog/serverless-or-containers-why-not-both/
- https://blog.thundra.io/containers-vs-serverless
- https://caylent.com/containers-vs-serverless
- https://dev.to/adnanrahic/containers-vs-serverless-from-a-devops-standpoint-e4n
- https://rancher.com/containers-vs-serverless-computing/
- https://www.cloudflare.com/learning/serverless/serverless-vs-containers/
- https://x-team.com/blog/serverless-vs-containers/
- https://ipt.ch/en/impuls/cloud-native-how-container-vs-serverless
- https://bioinformatics.csiro.au/blog/converting-traditional-architecture-to-cloud-native-applications/