Je tenais à faire un article sur un sujet bien précis qui reflète un retour d’expérience sur le déploiement d’applications Play! Framework en production. Je vais prendre l’exemple de ce site Web e-commerce : www.labottegardiane.com que j’ai développé from scratch à l’aide de Play! framework et jQuery en 2009 pour le compte d’un de mes clients. Il a été mis en production fin 2009, soit il y a plus de deux ans à l’écriture de cet article et ce sur un serveur Gandi. Il faut savoir qu’à l’époque c’était « osé » car l’offre ne proposait que des parts de 0,5 CPU et 128Mo de mémoire vive. Ces quota ont été doublé pour une part seule depuis mais la puissance disponible reste malgré tout un peu juste pour déployer du Java.

Donc comment faire pour héberger une application Java avec un minimum de performance ? Les premiers tests ont été désastreux avec uniquement quelques requêtes par secondes... J’ai donc effectuer du profiling du front avec notamment Firebug et YSlow afin d’apporter les optimisations nécessaires à mon code source. Ensuite, j’ai optimiser la configuration de mon application et mis en place un cache applicatif avec ehCache afin de soulager la base de donnée MySQL.

Cependant, la meilleur des optimisations a été de mettre en place un frontal Nginx avec une configuration des headers pour le cache et une compression zip adaptée couplés à la mise en place d’un webcache avec Memcached. Les performances sont désormais au rendez vous et le serveur ne pâti plus de pic de charges CPU sous mes agressions avec l’outil que j’utilisait à l’époque pour simuler la charge : apache-benchmark. Ainsi sur la page des produits, on obtient encore 124 requêtes par seconde aujourd’hui (je ne me rappel plus du score de l’époque qui était du même ordre) :

Concurrency Level:      10
Time taken for tests:   8.049 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      5478000 bytes
HTML transferred:       5245000 bytes
Requests per second:    124.25 [#/sec] (mean)
Time per request:       80.485 [ms] (mean)
Time per request:       8.049 [ms] (mean, across all concurrent requests)
Transfer rate:          664.67 [Kbytes/sec] received

L’application n’a pas été redémarré depuis plus d’un an et demi et les performances, comme le bon vin, ne font que s’améliorer. On remarque que le débit obtenu est très proche du débit théorique fourni par Gandi (5Mb). Pour preuve de l’ancienneté de l’application :

Aucun problème à signaler depuis malgré l’arrêt des mises à jour des logiciels suite à l’arrêt de la collaboration avec le commerçant pour le moment. Comme quoi performances et disponibilité ne sont pas si difficile a obtenir … même en environnement « hostile ». Cela dit, aujourd’hui je ne proposerais pas une telle solution à un client qui n’a pas de gros besoins de performances. Il faut savoir que la société derrière Play! framework (Zenexity) propose une plateforme d’hébergement d’applications : www.playapps.net (fermé depuis la publication de l'article) Pour 10€, les résultats sont au rendez vous et c’est clef en main... pourquoi se priver ! Par ailleurs, d’autres plateformes « cloud » proposent de plus en plus une compatibilité avec Play! framework comme par exemple Heroku. Peut être qu’un jour je ferais un article sur le sujet...

Note : depuis la publication de l'article, le site Web a été refait.