Serverless: Quando utilizar e aplicações com NodeJS

Node.js 28 de Fev de 2019

Ultimamente o termo serverless entrou em ascensão e muito se comenta sobre aplicações utilizarem essa arquitetura como forma de se ganhar performance evitando a configuração de servidores complexos através de containers ou até de arquiteturas mais tradicionais.

Na verdade é que três mitos precisam ser abolidos antes de falarmos sobre esse assunto:

  • Mesmo o nome sendo serverless existe servidor sim, ele só não precisa ser gerenciado por você, o que torna a configuração e o deploy muito mais simples;
  • Você não irá ganhar performance apenas por utilizar essa arquitetura e nem terá custos mais baixos, isso depende muito do tipo de aplicação;
  • Hospedar servidores HTTP completos com múltiplas responsabilidades não é o caso de uso para esse tipo de arquitetura;

Agora que estamos na mesma linha, chegou a hora de entendermos aonde a arquitetura serverless se encaixa, suas vantagens e desvantagens, casos de uso e quando evitar a utilização desse modelo. Ah claro, um pouco de código sempre é bom.

O que é serverless?

A arquitetura serverless representa um modelo de hospedagem para funções que não necessita configuração do servidor, ou seja, todas dependências para que sua aplicação rode já estão instaladas de forma nativa.

Essas funções podem ser "disparadas" de duas maneiras: Rotas HTTP assim como estamos acostumados em serviços REST comuns ou eventos disparados por outros serviços existentes.

Geralmente a arquitetura serverless é utilizada para processar códigos assíncronos que não tem necessidade de execução imediata e que podem causar um processamento desnecessário na aplicação principal hospedada em servidores comuns.

Importante frisar que toda função que utiliza esse modelo possui um limite de tempo de execução e é extremamente difícil de debugar ou testar, por isso, é importante que o serviço seja extremamente simples e tenha um objetivo bem definido com poucos efeitos colaterais.

Além disso, esses serviços são stateless e, por isso, não devem guardar nenhum estado entre cada execução pois cada nova execução pode reconstruir o servidor do total zero sem resquícios de uma execução anterior.

Casos de uso

  • Micro-serviços: Quando criamos aplicações através de micro-serviços podemos mover alguns dos serviços que escalam periodicamente para funções serverless;
  • Picos de acesso: Imagine que sua aplicação receba picos de acesso durante períodos isolados, mover o serviço que processa essas operações para essa arquitetura evita um escalonamento desnecessário do servidor e redução de custos;
  • Serviço com pouco tráfego: Outra utilidade legal é movermos serviços que não possuem tráfego constante para essa arquitetura já que, enquanto não executados, os serviços não são cobrados;
  • Diminuir go-to-market: Caso você queria acelerar a velocidade de publicação de um projeto em fase inicial, a arquitetura serverless ajuda por fornecer uma estrutura de deploy simples com custo baixo;

Vantagens do serverless

Apesar de termos citado algumas das vantagens dessa arquitetura nos tópicos acima, vamos entender agora os pontos legais que esse tipo de modelo proporciona à nossa aplicação:

  • Não precisamos configurar o servidor (Node, NGINX, Apache, etc...);
  • Extremamente barato: U$ 0,20/milhão de requisições na AWS (Fora tempo de computação caso seu serviço ocupe muito tempo);
  • Escalabilidade automática: Não importa se tivermos uma ou 1 milhão de requisições, os servidores são auto-escaláveis e tudo isso é gerenciado pela provedora;
  • Deploy muito simples: Subir novo código? Basta encapsular todo o código em um ZIP e subir pro servidor, o resto deixa com ele. Existem ferramentas que automatizam ainda mais isso;

Desvantagens do serverless

Essa arquitetura não é um mar de rosas e possui utilidades específicas, se você está pensando em utilizar serverless fique atento aos pontos abaixo:

  • Execuções espaçadas criam o servidor do zero, realizando cold-starts da aplicação que podem ocasionar perda de performance momentânea;
  • As funções executadas jamais podem passar de 300 segundos de execução, e se chegar perto disso o custo começa a aumentar bastante;
  • O debugging e teste das funções serverless é extremamente difícil, ainda mais quando essas dependem de eventos que ocorrem em outros serviços;
  • Utilizado da forma errada o custo é maior que servidores cloud comuns já que serviços serverless não são criados para aplicações com execuções constantes;

Dicas para iniciar

  • Cada provedor possui uma sintaxe única para configuração de serviços serverless, por isso você pode utilizar a ferramenta serverless.com que unifica a sintaxe entre todos provedores;
  • Cuidado com os pacotes instalados, lembre que todo seu código é zipado e jogado ao servidor, por isso, cada dependência instalada aumenta o tamanho do pacote;
  • Cuidado ao instalar dependências que possuem binários caso você esteja em ambientes Windows ou OSX. Como o deploy é feito realizando um zip de tudo, essas dependências não vão funcionar corretamente no Linux, uma dica é instalar o binário do Linux antes do deploy: npm install --arch=x64 --platform=linux --target=8.10.0 NomeDaLib;
  • Se você pretende mover um serviço HTTP construído com Node/ExpressJS inteiro para a arquitetura serverless, utilize o pacote serverless-http;
  • Para testar suas funções serverless que utilizam AWS Lambda e AWS API Gateway na sua máquina, de forma offline, você pode utilizar o serverless-offline;
  • Caso precise armazenar algum tipo de informação através da AWS Lambda para acessar através de outros serviços posteriormente, utilize o DynamoDB;

Endless

Assim como o serverless, que mesmo sendo "less" possui servidor, esse post é endless, mas possui um fim (desculpe pela piada).

Se você curtiu esse post não esquece de deixar um comentário abaixo, lembre que as tecnologias mais novas costumam entrar em hype e isso não é obrigatoriamente ruim mas pode desvirtuar sua cabeça achando que é a tecnologia que vai revolucionar o mundo da noite pro dia.

Essa arquitetura é extremamente legal e faz muito sentido em vários tipos de aplicações, mas querer utiliza-la independente do modelo do seu software pode ser desperdício de trabalho e dinheiro, então utilize as dicas do post para escolher a hora certa de apostar nela.

Marcadores

Diego Fernandes

Programador full-stack, apaixonado pelas melhores tecnologias de desenvolvimento back-end, front-end e mobile, é co-fundador e CTO na Rocketseat.