Cloud Computing

7 ago, 2014

4 dicas para tornar o seu aplicativo mais escalável para o ambiente de nuvem

Publicidade

O que é cloud?

O jargão do momento é o cloud, ou a nuvem. Pessoas, empresas e produtos diferentes possuem definições diferentes do que é cloud, onde ele começa ou onde a nuvem termina. Independentemente da solução de “cloud”, uma definição que todos parecem entender logo de cara é o conceito de escalabilidade. É um conceito bem simples de compreender, mas difícil de aplicar. Quanto mais escalabilidade, mais chances você tem de crescer e aguentar uma maior carga. Sem escalabilidade, você pode ser pego de calças curtas e não dar conta de todo mundo que quer acessar o seu conteúdo, ou consumir o seu produto ou serviço.

Por que utilizar a nuvem?

Todos nós fazemos software querendo que ele faça sucesso. Mas esse sucesso implica em uma multidão de pessoas acessando o seu site. E essa multidão de acessos pode ser pré-determinada (você aparece em algum programa de TV ou na home de um grande portal) ou, de repente, você viraliza. Independente da forma, ter um site escalável é a diferença entre se estabelecer de vez ou quebrar. Outros fatores, como histórico de acessos, podem te ajudar a ajustar os recursos de maneira que você não pague a mais por períodos de pouco acesso.

Diferenças entre escalabilidade horizontal e vertical

Existem dois tipos principais de escalabilidade: horizontal e vertical. Não falaremos muito sobre escalabilidade vertical porque não há muito o que falar… Você simplesmente compra o hardware mais potente. Existem programadores famosos, como Jeff Atwood, que recomendam essa técnica e ela faz sentido. Perder dias ou semanas de um ou mais programadores para escrever código escalável é bem mais caro do que comprar um servidor top de linha.

O problema é que, em algum momento, o mais caro dos servidores não vai mais dar conta. Aí chega a hora de pensar em escalabilidade horizontal. Essa é uma solução que já é aplicada por bancos de dados, que podem ser configurados em cluster com master/slave, por exemplo. O conceito também é simples: você tem vários servidores compartilhando a carga.

Soluções prontas

Hoje existem diversas soluções robustas para você colocar o seu site no ar e desfrutar de escalabilidade horizontal. Produtos como Google Cloud Platform, Heroku e o Jelastic da Locaweb gerenciam o seu site, adicionam mais servidores e te livram do trabalho pesado de ter que gerenciar infraestrutura, além de ter que administrar o seu produto. Contudo, é muito importante que o seu site esteja preparado para escalar horizontalmente antes de sair contratando um serviço de cloud. Caso contrário, você corre o risco de ver o seu investimento rendendo menos do que ele poderia.

Como deixar o meu site escalável

OK, chega de blá blá blá. Vou tentar ser o mais genérico possível e passar conceitos que podem ser checados e aplicados em sites feitos em todas as linguagens.

1. localhost é o seu inimigo

Imagina que no seu site você recebe uma imagem ou processa alguma informação e a guarda no disco. Daí você devolve para o usuário em algum outro momento. Isso funciona enquanto você tem um servidor só, mas quando o número de servidores aumenta, você não tem como garantir que no momento de entregar o conteúdo para usuário, a máquina encarregada da resposta é a mesma que recebeu o arquivo onde o dado foi escrito. Você pode evitar isso de algumas formas: utilizando um sistema de arquivos compartilhado, gravando informações em um banco de dados ou utilizando um serviço externo como o Amazon S3

2. Cache

Pelo fato do seu site ser dinâmico, ter bastante gente acessando a mesma página vai fazer com que ele gere os mesmos dados de novo e inúmeras vezes. Caching do lado do servidor é uma alternativa para isso. Se os seus servidores compartilharem um cluster de Memcached, a sua carga além de ser distribuída, será diminuída, por que o primeiro que gerar a página grava e os outros só repassam a informação já gerada. Caching é um tema interessante, que deixarei para abordar melhor em um artigo futuro.

3. Banco de dados

Soluções de PaaS prontas normalmente cuidam da escalabilidade do bando de dados para você. Tudo o que é preciso fazer é apontar para o banco de dados e o servidor de cache indicados pelo serviço e pronto.

4. Processamento assíncrono

Imagine que você precisa gerar um PDF, processar uma planilha, fazer um pagamento de cartão de crédito. E que essas variáveis estão fora do seu controle e podem demorar vários segundos, ou minutos. Segurar uma conexão aberta durante todo esse tempo pode ser catastrófico para o seu produto quando se tem um monte de gente na fila querendo fazer outras coisas. Um solução para isso é ter um ou mais servidores reservados para fazer trabalhos assíncronos. No lugar de você receber os parâmetros, processar tudo e devolver logo de cara, você pode receber os parâmetros e enfileirar para que isso seja executado em segundo plano.

O usuário fica com um código ou protocolo e usa para checar o status do processo. Quando o trabalho estiver pronto você, libera um link ou atualiza um status em algum registro. A vantagem dessa técnica é que você pode ter uma carga grande, que ao invés de ficar fora do ar, você vai levar mais tempo para processar todos os itens da fila. Cada linguagem e ambiente possui ferramentas específicas para isso. O Ruby tem o Sidekiq e Java tem o HornetQ, por exemplo. Outra grande vantagem dessa técnica é que você pode ter o seu site em uma linguagem e os seus workers em outra. Contanto que eles conversem com a mesma base de dados e/ou os mesmo web-services você fica livre para otimizar/refatorar/re-escrever as partes em separado.

Conclusão

Escalabilidade é um tema bastante extenso e bastante sensível também. Podemos nos preparar de todas as formas que imaginarmos e mesmo assim sermos pegos de surpresa numa parte do nosso sistema que parecia inofensiva. Exitem ótimos sites que publicam informações do básico ao avançado, como o High Scalability. Pretendo escrever mais artigos e expor cada tema abordado hoje em artigos individuais com exemplos concretos do “mundo real” que os programadores do dia a dia enfrentam.