terça-feira, 17 de dezembro de 2013

Google App Engine: a história de um prisioneiro feliz


No início de 2009 eu trabalhava em uma startup com Java, utilizando frameworks muito conhecidos da plataforma, como Spring e Hibernate. Decidi então, no fim do ano, construir um site de transmissão de fotos, visando entender todo o processo de desenvolvimento.

No início, comecei a fazer o setup análogo ao que já conhecia: instalei Maven e Nexus, comprei um host Java. Demorei cerca de um mês, utilizando meu tempo livre, para configurar todas ferramentas. Mas a aplicação iria transmitir muitas fotos pelas rede, meu cliente pretendia fazer promoções em sites de compras coletivas. Eu estava certo de que meu servidor não iria aguentar essa carga.

Foi justo nessa época que um amigo me apontou a solução. Ele comentou que o Google tinha criado um serviço, App Engine (GAE), que resolveria meu problema. Ele fornecia um ambiente de desenvolvimento e deploy simples, prometendo escalar sua aplicação automaticamente.

Para me convencer sobre o poder do GAE ele fez uma demosntração: em 5 minutos no almoço criou uma aplicação Hello World do zero e fez o deploy. Realmente fui convencido e a partir daquele momento passei a utilizar a plataforma. Nascia assim a primeira versão do site, após 3 meses de desenvolvimento, que se chamava Revelação Virtual.

O que permitiu o rápido desenvolvimento foram as facilidades que a plataforma possuía. Diferente do ambiente Java comum, toda documentação se encontra centralizada e existe API para resolver vários problemas comuns do desenvolvimento web, como envio de email, upload e download de arquivos, filas de tarefas, entre muitas outras funcionalidades.

Mas como qualquer escolha em tecnologia, sempre existem dificuldades. A maior delas é que o ambiente do GAE é muito particular, impondo restrições para que a plataforma possa realmente escalar de forma automática.

Como maior exemplo de restrição, cito o Big Table, banco de dados NoSQL distribuido. Nele não é possível fazer join e as pesquisas são limitadas. Ou seja, não existem diversas operações comuns aos bancos tradicionais. Sendo assim, para programar nessa plataforma são necessárias várias mudanças de paradigma para quem já programa em um ambiente mais ortodoxo.

E foi por conta dessa forma de funcionamento particular do GAE que me vi obrigado a alterar todo o backend de Java para Python. Por conta do problema de cold start  os clientes sofriam com uma grande latência da aplicação quando uma nova instância era necessária. Acabei testando o Python e resolvendo o problema construindo o microframework Zenwarch para carregar a aplicação web de forma preguiçosa. Mais do que apenas resolver o problema, acabei percebendo que o desenvolvimento em Python era muito mais produtivo e acabei me aprofundando em seu estudo.

Por conta dessa mudança, passei a frequentar a comunidade Python e suas conferências. Para minha surpresa, muitos pythonistas não conhecem a plataforma, sendo poucos os que a usam para sistemas em produção. A maioria usa o framework DJango e servidores linux, sendo necessário instalar toda a base para o website, como NGinx, Gunicorn, SupervisorD e outras ferramentas. Acabei aprendendo um pouco sobre essa estrutura trabalhando na empresa ZNC, justamente para poder compará-la com a estrutura do GAE.

Durante esse período na ZNC, pude constatar o grande poder que o Django fornece ao desenvolvedor, principalmente através dos painel de administração. Contudo, considerei a curva de aprendizado do framework em si relativamente alta. Além disso, as ferramentas necessárias para se poder fazer um deploy com um clique tornam todo o processo muito complexo. Definitivamente a simplicidade da plataforma do Google me deixou "mal acostumado". Ou melhor, me deixou “bem acostumado”.

Mas além da simplicidade, outro fator fundamental me faz preferir o GAE: o preço. A plataforma oferece uma cota grátis de uso que se renova diariamente. Isso permite que se teste o site sem haver necessidade de investimento, até que ele ganhe tração. Mais do que isso, você paga pelo que realmente utiliza. Ou seja, se o tráfego diminui, também cai o seu custo.

Mas durante minhas discussões com amigos em favor da plataforma, havia sempre um argumento difícil de refutar: o chamado lock in. Ou seja, ao utilizar o serviço do Google, você acaba por se tornar prisioneiro da plataforma por causa do uso de suas bibliotecas e APIs personalizadas. Meu amigos sempre me alertaram que se o Google alterasse sua política de preços, eu ficaria refém do serviço, por não poder portá-lo para outro lugar.

Minha única justificativa, no início, era de que durante esses 3 anos a empresa nunca havia mudado sua política de preços de forma que eu fosse afetado significativamente. Sempre eu comentava sobre o custo irrisório do serviço, respondendo para o pessoal com o título desse post: sou um prisioneiro feliz.

Hoje o lock in não é mais um verdade absoluta. Existe o projeto de código aberto App Scale que permite a migração de sua aplicação para outras infraestruturas. Mas realmente até hoje não portei nenhuma, apesar de saber que já conseguiram portar com sucesso a aplicação do QMagico usando esse projeto. Além dele, existe também o CapeDwarf.

O fato é que em minha última conversa sobre o assunto com amigos me incentivaram a contar mais sobre essa experiência. Decidi então escrever esse post e ir além: no início 2014 farei um curso, com vídeos gratuitos, sob o título “Python e App Engine: você programa e Google escala!”. Quem sabe não consigo outros prisioneiros felizes como companheiros.

Atualização: já iniciei o curso no fim de 2013, confira nessa playlist do Youtube.