Escrevendo e migrando aplicações para o Google App Engine

Recentemente migramos nosso site para o Google App Engine (GAE), o serviço de cloud computing do Google, fazendo uso do suporte a aplicações Java. A ideia é que você desenvolva sua webapplication normalmente e faça o upload do war para os servidores do Google usando um SDK, que também possui um servidor local para desenvolvimento. Pronto! Sua aplicação web agora oferece alta escalabilidade e disponibilidade.

Algumas restrições existem, no entanto. Vamos passar por elas e comentar cada uma, que no início podem ser uma barreira para o desenvolvedor. Para começar, há uma whitelist especificando as classes do Java que são suportadas. As classes da biblioteca padrão não listadas são bloqueadas. Pode parecer inconveniente, mas estas limitações são necessárias para garantir a segurança e escalabilidade do serviço — basta lembrar que uma mesma máquina é dividida entre muitas aplicações, e que cada aplicação pode estar rodando em um grande número de servidores.

O Google App Engine também não permite que novos arquivos sejam criados pela aplicação no servidor, já que isso poderia implicar em problemas de sincronização entre os sistemas de arquivos de suas muitas instâncias. Também não é oferecido um banco de dados relacional, mas sim uma datastore sobre o BigTable, que pode ser acessada pelas APIs do JDO e da JPA. Relacionamentos many-to-many, consultas com join, agregações (sum, avg, max, etc) e polimórficas não são suportadas, mas a maior parte das demais operações funciona como de costume sem a necessidade de maiores mudanças. Trata-se de uma característica comum dos bancos de dados não-relacionais, que abrem mão de algumas funcionalidades para obter maior desempenho, escalabilidade e disponibilidade. Pode ser trabalhoso migrar de um banco de dados relacional para o BigTable, além de ser uma tecnologia proprietária do Google.

Outra limitação importante é a impossibilidade de criar sockets e Threads. Todavia, o App Engine possui mecanismos próprios que permitem a realização de requisições HTTP e o envio de emails (com restrições na especificação do remetente). Em breve uma API de agendamento de tarefas será disponibilizada para o Google App Engine Java.

Ainda, o suporte a Expression Language vem desativado por padrão. Para ativá-lo, é necessário adicionar a seguinte linha em todos os arquivos JSP que fazem uso de EL:
<%@ page isELIgnored="false" %>

No caso de arquivos de tags, deve-se adicionar:
<%@ tag isELIgnored="false" %>

A tag <include-prelude> no web.xml também é ignorada, mas é possível contornar o problema adicionando algo como a linha abaixo no começo dos arquivos JSP:
<%@ include file="../prelude.jspf" %>

Um problema de outra é ordem é a inicialização e a manutenção das instâncias, conhecido como cold start. Quando sua aplicação é chamada pela primeira vez, várias instâncias são produzidas de forma distribuída pelos servidores da nuvem. Este processo é bastante lento, podendo consumir vários segundos, e depende também da velocidade do contexto da sua aplicação web. Os acessos seguintes são respondidos com baixa latência, mas, após um período de inatividade, as instâncias são destruídas, exigindo que todo o lento processo de inicialização seja refeito pelo serviço em um próximo acesso. Para evitar isso, a prática mais comum tem sido usar o agendador de tarefas do próprio App Engine para visitar alguma página do site a cada poucos minutos — e esta é uma solução que também possui seus problemas.

Por causa da grande quantidade de componentes restritos, muitos frameworks, como Spring, implementações de JSF, mapeadores XML, exigem ajustes para rodar no GAE. O mesmo se aplica ao VRaptor 3 e, para facilitar o trabalho dos usuários, muitos deles oferecem uma versão voltada para o uso no Google App Engine, incluindo todas as alterações necessárias. No caso do VRaptor 3, você pode obter um blank-project pro GAE na página de downloads e usa-lo como esqueleto de um novo projeto, que pode ser facilmente importado e modificado no Eclipse (existe um plugin do Google bastante prático, mas um build.xml adequado ao GAE é uma alternativa bastante razoável).

Em post anterior, o Paulo Silveira já havia falado, de forma geral, sobre as vantagens de manter sua aplicação no cloud, mesmo quando o volume de requisições não é grande o bastante para se representar um gargalo, como é o nosso caso e pode ser visto pelos paineis de controle do GAE:

Gráfico de requisições por segundo no www.caelum.com.br

Requisições por segundo no www.caelum.com.br

Sobre o Google App Engine, em particular, vale ainda acrescentar que a administração é bastante simples, com relatórios e estatísticas apresentados de forma coerente, e também que é possível executar múltiplas versões da sua aplicação facilmente. O serviço ainda é beta e tem seus problemas ocasionais, mas, até o momento, tem se comportado de forma bastante satisfatória. Considere o uso do cloud para sua próxima aplicação e livre-se de boa parte da preocupação com hardware, grids, clusters e infraestrutura.

14 Comentários

  1. Carlos 18/11/2009 at 16:07 #

    Pow, eu moro em João Pessoa – PB, e gostaria de comprar a apostila FJ – 26, porque vocês não vendem separado???

  2. leandro 19/11/2009 at 19:26 #

    Em primeiro lugar acho muito legal esse pioneirismo da caelum em usar este tipo de tecnologia, comprovando que é possível e com qualidade. Bom, será que usando python a coisa toda é menos trabalhosa? Conhecem alguma implementação em python usando o GAE?

  3. Fernando Meyer 27/11/2009 at 00:15 #

    A versão python não sofre com esses problemas de bootstrap que vc comentou. A melhor coisa que eu fiz esse ano foi reduzir minhas despesas a Zero com VPS, migrei todas as ferramentas que eu usava para a app engine, tomou um tempo mas foi muito interessante e bem lucrativo.

  4. Daniel 05/12/2009 at 16:35 #

    Esse recurso é muito bom !

  5. Paulo Silveira 08/12/2009 at 17:32 #

    O Pedro Matiello me enviou o seguinte link:
    http://googleappengine.blogspot.com/2009/12/request-performance-in-java.html

    Parece que o pessoal do Google realmente ta preocupado com o cold start das aplicacoes, e esta estudando como minimiza-lo. Excelente noticia.

  6. Gerson 03/02/2010 at 14:39 #

    Parabéns pelo Post!

    Aqui vai mais alguma dica: Como ativar as sessões

    http://code.google.com/intl/pt-BR/appengine/docs/java/config/appconfig.html#Enabling_Sessions

  7. Roberson 16/01/2011 at 19:07 #

    Tentei colocar meu site no Cloud do google usando Primefaces e JSF, tenho tido muitos erros, teriam algum tutorial mostrando um passo-a-passo de como fazer o hack?

  8. Sérgio Lopes 16/01/2011 at 20:14 #

    Oi Roberson!

    Aqui na Caelum usamos o VRaptor. Você pode ver um guia de como usá-lo no GAE aqui: http://vraptor.caelum.com.br/documentacao/google-app-engine/

    Abraços

  9. Joander Vieira Cândido 03/09/2013 at 18:22 #

    Ola, pessoal, tenho uma dúvida com o Search API do gae, postei lá no guj.com.br para que as respostas sirvam para outros:
    http://www.guj.com.br/4837-gae—search-api
    quem pode me ajudar ae ?
    valeu, abraço,

Deixe uma resposta