Serverless — mais foco nas suas aplicações
Em uma típica aplicação web, o servidor aceita e processa as requisições HTTP do front-end. Os dados podem trafegar através de várias camadas de aplicação até finalmente ser salvo no banco de dados. Finalmente, o back-end gera a resposta — normalmente em formato de JSON — que então é retornada ao front-end. É interessante notar que este exemplo está bem simplificado, a maioria dos sistemas é ainda mais complexo, uma vez que consideramos elementos como Load balancer, transações, clustering, cache, mensageria e redundância de dados. A maior parte destes softwares estão hospedados em servidores em data centers ou na nuvem. A manutenção destes servidores é uma tarefa demorada e que muitas vezes exige profissionais dedicados para isto.
Com o passar do tempo, cada vez mais surgem soluções que retiram a preocupação e controle sobre os servidores e facilitam para o desenvolvedor focar na solução, como é possível notar na Figura 1.
A quase duas décadas atrás, nossas aplicações estavam hospedadas em servidores físicos. Algum tempo depois, surgiram as máquinas virtuais — e também as soluções PaaS (Platform as a service). Apesar as soluções PaaS resolveram parte do problema virtualizando e automatizando a entrega de servidores. Mas ainda existia o trabalho de manter os sistemas operacionais de cada servidor. No próximo passo da evolução, chegaram os Containers. Contudo, para manter um cluster, ainda é preciso pessoas especializadas na manutenção desta solução. Com o intuito de retirar esta carga de trabalho do profissional de desenvolvimento de software, surgiu a arquitetura Serverless.
O que é?
O Serverless computing permite que o desenvolvedor crie e execute suas aplicações e serviços sem pensar em servidores. Uma aplicação Serverless não exige qualquer tipo de gerenciamento de servidor. É possível usar esta arquitetura para quase todo tipo de aplicação ou serviço back-end, e quem fica responsável por executar e escalar a aplicação é a solução do fornecedor(por exemplo AWS, Google Cloud ou Azure).
Uma das principais vantagens reside no direcionamento do foco dos desenvolvedores. Eles não precisam mais se preocupar em gerenciar e operar servidores ou Containers. Assim podendo dar a devida importância para os produtos e soluções de negócio.
É importante notar que o conceito Serverless está espalhado por todas as áreas da Cloud computing. A AWS, por exemplo, oferece ferramentas para computação, proxy de API, armazenamento de dados, banco de dados, mensageria e entre outros. Resumidamente falando, todos estes serviços no qual contratamos e não conseguimos acessar o servidor de origem — e consequentemente não nos preocupamos — , são potencialmente serviços Serverless.
Neste post, vamos focar na novidade do momento, nas soluções Serverless Computing — também chamadas de functions — ,que é a execução de código na núvem.
Quando devo utilizar e quando não devo?
Desde 1986 já era um assunto abordado: Na área da tecnologia não existe bala de prata. E isso se aplica também para a arquitetura Serverless. Vamos dar uma olhada quando utilizar ou não esta tecnologia.
Pontos de atenção
Não é uma tecnologia para todos. As functions rodam em uma nuvem publica. Calma, os seus dados estão seguros lá. O detalhe de rodar em uma nuvem publica, é que — sem perceber — você pode dividir o mesmo servidor com outras empresas. Então caso seu sistema seja uma aplicação critica, que necessita de alta disponibilidade e performance, pode ser que não seja a melhor opção.
Controle da infraestrutura. A necessidade de controlar a infraestrutura pode ser um outro fator decisivo. Nas soluções que o mercado oferece existem poucas configurações que é possível fazer, dentre as possibilidades estão: a linguagem utilizada, memória RAM, permissões e time out.
Dependência de fornecedor. Este é um dos primeiros problemas que pensamos ao adotar uma tecnologia assim. A maneira que o código é escrito, mudar de fornecedor para fornecedor. Para superar isto, existem alguns framework — o mais famoso é o Serverless Framework. Mas mesmo assim, evitar ficar fortemente acoplado a um fornecedor é difícil, pois em conjunto com as functions normalmente utilizamos outros serviços, como por exemplo de armazenamento de arquivos(p.e S3), proxy de API(p.e Aws API Gateway) entre outros.
Funções inativas. Também chamado de “Cold Start”, é quando uma função fica um determinado tempo sem ser requisitada e entra em processo de inatividade. Quando ela está inativa e é requisitada pela primeira vez, o tempo de resposta será um pouco mais demorado. Existem alguns workaround — vulgo gambiarra — que podemos fazer para evitar que ela fique inativa, como por exemplo criar eventos agendados para chamar a função de tempo em tempo.
Processamentos longos. Outra característica importante das functions é que elas possuem um limite de timeout — nas maioria dos fornecedores é de no máximo 5 minutos. Esta característica existe para garantir que as functions sejam rápidas e escaláveis. Afinal, seria difícil garantir isto com vários processos travando os servidores e não dando espaço para novas rodarem.
Por que é legal utilizar?
Não há mais servidores. Como já falamos anteriormente, com Serverless não existe a preocupação de manter uma infraestrutura, visto que o fornecedor fará isto por nós. Se a sua aplicação não possui requisitos que necessitem gerenciar os recursos do servidor, então Serverless pode ser uma ótima opção.
Muitas utilidades. As functions são stateless, esta característica possibilita resolver problemas que são solucionados através da escalabilidade e processamento paralelo. Usando a arquitetura Serverless é possível criar quase qualquer tipo de aplicação back-end. Utilizando o conjunto correto de ferramentas, tarefas que normalmente levam semanas para serem concluídas, agora podem ser feitas em dias ou até horas. Esta abordagem pode funcionar excepcionalmente bem para as startups que querem inovar e lançar rapidamente.
Baixo cu$to. Na arquitetura tradicional baseada em servidor requer servidores que não funcionam necessariamente a plena capacidade. Escalar, mesmo com sistemas automatizados, envolve um novo servidor, que muitas vezes é desperdiçado até que haja um aumento temporário no tráfego. Os sistemas Serverless são muito mais granulares em relação à escala e são rentáveis, especialmente quando o trafego é irregular ou inesperado. As soluções Serverless são cobradas por uso, isso significa que você só vai pagar para aquilo que realmente está utilizando.
Menos código. No inicio do post falamos sobre as aplicações tradicionais e as várias camadas delas. As soluções Serverless possuem menos complexidade neste sentido, pois há menos necessidade de ter um sistema back-end de várias camadas, especialmente se você permitir que o front-end faça mais trabalho e converse diretamente com os serviços(e o banco de dados).
Escalável e flexível. Como desenvolvedores, não precisamos rescrever todo o nosso back-end com a arquitetura Serverless. Uma alternativa razoável é resolver problemas específicos, especialmente aqueles que precisam de paralelização. Visto que os servidores são completamente gerenciados por terceiros, a escalabilidade vem integrada. Isso significa que não é necessário configurações adicionais para aproveitar a escalabilidade que a arquitetura proporciona.
Fornecedores
Se você chegou até aqui, espero ter despertado o seu interesse nesta nova arquitetura. Atualmente existem três principais fornecedores de soluções Serverless. São eles: Amazon AWS, Microsoft Azure e Google Cloud. Apesar do conceito Serverless ter tomado maior visibilidade atualmente devido as funções e capacidade de executar código sem um servidor. Já há algum tempo estamos consumindo diferentes serviços que também abordam o conceito. Na Figura 2 é possível visualizar um mapa com serviços similares em cada fornecedor.
Conclusão
Recentemente eu li uma noticia que dizia que está crescendo cada vez mais o número adoções de soluções Serverless e Containers. Acredito que esta é uma via sem retorno, este sentimento de querer “se livrar” dos servidores está presente no dia a dia dos profissionais de TI já há um algum tempo. Claro, como falamos anteriormente, não existe bala de prata. Na minha opinião, o que nós como profissionais devemos fazer é conhecer todos os “tipos de munição” disponíveis e saber quando utilizar. Afinal, o segredo do sucesso é estar preparado.
Se você gostou do assunto e quer continuar aprendendo, eu vou deixar abaixo uma lista de links que me interessaram durante a elaboração deste post.
- https://github.com/anaibol/awesome-serverless: Eu diria que esta é a primeira parada para quem quer continuar estudando. É uma lista com curadoria da comunidade, tem conceitos, fornecedores, frameworks, ferramentas e tudo o que possa imaginar referente a Serverless.
- https://serverless-stack.com/: É um guia Open source que ensina a criar uma aplicação Serverless(Aws Lamba) com React.
- https://localstack.cloud/: Uma das limitações, para nós desenvolvedores, é o fato da maioria dos fornecedores exigir o cartão de crédito($$$) para testar as soluções — eu mesmo já fui pego de surpresa por umas cobranças após o período de testes da AWS terminar. O LocalStack é uma solução que permite desenvolver e testar offline a maior parte das soluções da AWS. Fiz um post com um tutorial de uso.
Se quiser trocar uma ideia ou entrar em contato comigo, pode me achar no Twitter(@e_ferreirasouza) ou Linkedin.
Grande abraço e até a próxima!