Skip to content

Instantly share code, notes, and snippets.

@kemelzaidan
Forked from lucasuyezu/horizontal_scaling.md
Last active August 29, 2015 14:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save kemelzaidan/550e4898119f9af70aa0 to your computer and use it in GitHub Desktop.
Save kemelzaidan/550e4898119f9af70aa0 to your computer and use it in GitHub Desktop.

4 Dicas para Tornar o seu Aplicativo Mais Escalável para o Ambiente de Nuvem

##O que é cloud?

O jargão do momento é o cloud, 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 agüentar 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 quê 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 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 banco 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 guarda ela 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 mesmo 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

Aqui seria interessante colocar um conclusão breve e falar dos próximos artigos que poderão vir. Inclusive dizendo qual será o tema do primeiro. Gere interesse em acompanhar a continuidade da série

Links para leitura:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment