##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.
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.
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.
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
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.
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.
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.
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