Développer sur Google App Engine

Depuis 1 mois je teste le déploiement de services sur Google App Engine. Le moins que l’on puisse dire c’est que c’est loin d’être aussi simple que ce que j’avais vu pendant la Devoxx France. Je vous propose un petit tour sur ce que j’ai remarqué.

Le Data Store

Même si Google propose une base SQL en version Beta, j’ai utilisé le datastore No SQL par défaut. Pour simplifier la gestion de la persistance, la librairie Objectify est très bien adaptée. La première chose à faire est de bien identifier les champs à indexer. Par défaut un paramètre est indexé, mais plus il y a d’index plus le coût d’écriture est important.

Attention aussi à la notion d’objet embeded. On ne peut le faire qu’à un niveau. Donc une classe embeded ne peut pas avoir d’attribut List.

Mais la plus grosse surprise que j’ai eue c’est que l’écriture se fait de façon asynchrone. Après avoir persisté un objet il faut attendre 5-6s pour pouvoir le lire en base. Il faut donc ruser et utiliser des caches pour masquer ce délai.

Le Blobstore

C’est une des fonctions intéressantes du service. Elle permet de stocker facilement des fichiers, des images par exemple. Et pour les images justement il y a même une astuce pour les redimensionner.

// Resize the image to 32 pixels (aspect-ratio preserved)
http://your_app_id.appspot.com/randomStringImageId=s32
// Crop the image to 32 pixels
http://your_app_id.appspot.com/randomStringImageId=s32-c

Pour trouver de l’information sur cette fonction, il faut lire la version Anglaise de la doc. En effet au début on apprécie le fait que toute la doc de Google App Engine ait été traduite en Français. On déchante vite lorsqu’on s’aperçoit que cette dernière n’est pas au même niveau que la version anglaise. Donc n’oubliez pas de lire la VO :)

Pour revenir au BlobStore, j’ai eu un problème pour gérer les fichiers non renseignés dans un formulaire. Sur un formulaire où l’utilisateur peut éventuellement uploader 1 fichier, un blobstore vide est créé s’il n’y a pas de fichier.

Ce comportement est d’autant plus étrange qu’on ne le retrouve pas sur le serveur local en mode dev. Une autre leçon à retenir : tester au plus tôt en production votre code.

Pour résoudre le problème, il faut tester la taille du fichier uploadé pour ensuite le supprimer s’il est vide.

if (blobs.get("uploadFile") != null) {
 BlobKey blobKey = blobs.get("uploadFile").get(0);
 BlobInfo blobInfo = new BlobInfoFactory().loadBlobInfo(blobKey);
 if (blobInfo.getSize() > 0) {
  uploadFileUrl = imagesService.getServingUrl(blobKey);
 } else {
  blobstoreService.delete(blobKey);
 }
}

A suivre

Je termine là mes remarques sur la partie purement dev de Google App Engine. Mais j’ai eu d’autres surprises que je vous détaillerai prochainement.