Google App Engine Suite
18 Jul 2012Comme expliqué dans le premier article j’ai rencontré certaines difficultés au niveau du développement avec Google App Engine. L’intégration et la gestion de la plate-forme a aussi amené son lot de surprises.
Gestion des instances
Nous utilisons GAE pour un service qui a peu de trafic. En mode gratuit aucune instance n’est lancée par défaut, donc chaque utilisateur a un risque de déclencher le lancement d’une instance. Il faut 18 secondes pour démarrer mon instance: 18 secondes ce n’est pas énorme pour démarrer un serveur d’applications, par contre pour répondre à une requête HTTP c’est une éternité.
Pourquoi ces 18 secondes ? J’ai décomposé un peu les choses :
- 2s – GAE avec juste une servlet
- 11s – Spring (MVC + Security)
- 2s – URLRewrite
- 2s – objectify
C’est donc clairement Spring qui prend le plus de temps au démarrage. Mais d’un autre côté, même sans 6 secondes pour répondre à une requête c’est déjà trop.
Pour éviter ce problème, il faut donc minimiser le nombre de démarrages d’instance. La solution “lowcost” est de configurer un cron toutes les minutes sur votre application. De cette façon vous avez une chance d’avoir toujours une instance en ligne et vos clients ont des temps de réponse corrects. Mais ce n’est pas une science exacte, j’ai quand même eu des problèmes. L’autre solution est d’activer la facturation (2,10$ par semaine au minimum) pour utiliser les instances “idle”. Vous pouvez garder N instances démarrées sans arrêt. Mais même avec cette option je n’ai pas un comportement satisfaisant. Déjà certains clients tombent encore sur une requête de 18s, c’est très rare heureusement, mais ce qui m’inquiète le plus c’est de voir GAE devoir lancer 3 instances pour répondre à 2 clients ! Sur les 24 dernières heures j’ai eu 400 requêtes (statiques et dynamiques), je pense que même un simple apache sur une instance micro Amazon est capable d’encaisser cette charge et bien GAE a eu besoin de lancer 2 instances.
D’un autre côté, la notion d’instance “idle” veut bien dire ce qu’elle veut dire : “instance inactive”. C’est un moyen de pouvoir anticiper un pic de charge. Donc dès qu’un utilisateur arrive sur mon service, une seconde instance est lancée (par une requête /_ah/warmup). Donc il est assez logique de voir souvent 2 instances. Mais pourquoi GAE en lance régulièrement une troisième !?
J’ai donc beaucoup de mal à comprendre ce fonctionnement difficilement prévisible, les joies du PAAS :)
Un problème avec la 3G
On a eu un autre problème heureusement passager. Le 18 juin pendant plusieurs heures tous les services hébergés sur GAE n’étaient plus accessibles sur les réseaux 3G Bouygues et Orange. J’ai fait le test sur plusieurs services utilisant GAE en wifi, sur une box ou sur le réseau SFR aucun problème, mais sur les réseaux Orange et Bouygues on avait la page :
Aucun retour de google sur ce problème qui heureusement ne s’est pas reproduit.
Conclusion
C’est donc une expérience un peu mitigée. Ce manque de contrôle me gêne un peu. Si on ajoute à cela que le développement réalisé est complètement dédié à GAE, il faut vraiment réfléchir avant de choisir cette plateforme. En tout cas si vous tentez l’aventure, surtout pensez au temps de démarrage de l’instance dès le début. Mais oubliez Spring ou Play qui ne fait pas mieux à ce niveau-là.