Qualquer serviço web, por mais que esteja disponível 24/7/365 em algum momento deverá sofrer uma paralisação seja por uma manutenção, atualização ou qualquer problema imprevisto.
Com o GAE não é diferente, a grande vantagem é que o próprio ambiente lhe avisa destes momentos, sendo que você pode deixar sua aplicação já pronta para continuar funcionando(mesmo que não 100%) durante estes períodos.
A camada de persistência(Datastore) por exemplo, em períodos de manutenção, entra em um estado especial em que somente é possível realizar leituras na base(read-only), nenhuma modificação ou alteração na base é permitida. Nestes períodos, se a aplicação realizar alguma escrita ou modificação, o próprio servidor do GAE lhe lançará uma exception informando da impossibilidade de escritas e modificação, lhe dando a possibilidade de ao invés de ficar com toda a sua aplicação fora do ar, você pode capturar esta exceção e informar ao usuário que determinada operação não foi possível no momento e que tente novamente mais tarde(ou qualquer coisa do tipo...).
Caso você esteja utilizando JPA, este seria algo parecido com o seu código de tratamento:
EntityManager em = EntityManagerFactory.createEntityManager();
try {
em.persist(entidade);
em.close();
} catch (com.google.apphosting.api.ApiProxy.CapabilityDisabledException e) {
// Esta exceção informa que o Datastore está em modo read-only.
// Tente novamente mais tarde.
}
Simples e indolor, não?
Outra API que possibilita tratar períodos críticos do GAE é a API de cache. Durante períodos de manutenção ela também é desabilitada e entra em um estado de 'somente leitura'. Porém a principal diferença para o Datastore nestes períodos, é que isso acontece de forma transparente para sua aplicação, impactando talvez somente na performance, pois toda vez que você tentar gravar uma informação em cache neste período, a escrita é ignorada, e toda leitura lhe retorna uma referência nula, como se o cache não encontrasse nenhuma entrada para sua busca.
De qualquer forma, se você quiser saber mesmo assim quando o cache está fora de serviço, é possível com o seguinte código:
MemcacheService ms = MemcacheServiceFactory.getMemcacheService();
ms.setErrorHandler(new StrictErrorHandler());
try {
ms.put(key, value);
} catch (com.google.appengine.api.memcache.MemcacheServiceException e) {
// Caso capturou esta exception, é sinal que o Memcache está fora
}
Um detalhe muito importante sobre estes períodos é também sobre a sessão web. Internamente as sessões no GAE são gerenciadas pelo Memcache e pelo Datastore, logo, as sessões também estão em modo read-only durante estes períodos. Ou seja, mais um detalhe a se levar em consideração durante o design de sua aplicação no GAE.
http://twitter.com/rafanunes
http://twitter.om/youandwe
http://www.yaw.com.br



1 comentários:
Muito legal estes recursos do Google App Engine. Valeu Rafael!
[]s
Yara
Postar um comentário