L’Open World Forum 2012

logo open world forum 2012L’Open World Forum 2012 s’est tenu le week end dernier à Paris.

Certains blocs de sessions étaient pris en charge par l’OSDC, le FUDCon (Fedora), le PAUG, Ruby.rb et divers groupes FOSS. De la diversité mais un planning assez opaque et quand à trouver la bonne salle parmi 9 salles sur 3 étages plus un auditorium …

Même si on retrouve toujours un peu les mêmes, la communauté Java était peu représentée et c’était l’occasion de croiser d’autres communautés de langages ou de pratiques.

Les gros événements étaient les présentations Google TV et le PAUG Conf Day. Beaucoup de monde et j’étais en retard pour d’autres contraintes donc au final j’ai beaucoup picoré dans les sessions de l’OSDC qui avait fourni un planning détaillé et j’ai gardé deux des sessions pour faire ce post. Les sessions ont été filmées par le PAUG et l’OSDC et seront disponibles bientôt.

L’Open World Forum c’était aussi la présence d’artistes et de sessions d’initiation à l’informatique pour les enfants. J’en parlerai dans un autre post sur le site de Duchess France.

Mais revenons en aux sessions techniques.

Choisir entre la corde et le poison

NoSql, cloud et montée en chargePierre Couzyosdc

Row of network servers in data centerPierre Couzy travaille chez Microsoft. Il est venu partager son expérience et les leçons qu’il a apprises sur le jeu Atlantis Fantasy. C’est un jeu Flash dont le back end est hébergé sur le cloud Azure qui utilise MongoDB en plus d’une base SqlServer classique.

Je n’aurais jamais cru écrire deux des mots de la phrase précédente sur ce site, mais en définitive les leçons qu’il a partagé sont valables sur beaucoup d’environnements Cloud.

Les jeux en ligne Facebook ont un cycle de vie en loi de Poisson avec un démarrage assez brutal lors de la propagation sur les réseaux sociaux, un plateau plus ou moins court selon l’attrait du jeu et un déclin en longue traîne au fur et à mesure que les joueurs se lassent. Les périodes critiques économiquement sont la croissance très rapide avant le plateau et le début du déclin. Dans les deux cas, la capacité doit s’adapter rapidement pour satisfaire les utilisateurs ou pour éviter des coûts disproportionnés. Le cloud est alors bien adapté pour gérer les phases de croissance et de maturité et ces jeux migrent souvent sur un hébergement classique moins couteux pour gérer le déclin. L’autre souci à gérer est qu’un jeu en ligne peut difficilement tolérer des arrêts pour maintenance et a très peu d’inactivité. Il marque seulement un creux dans la nuit. D’un autre coté des arrêts très brefs sont peu perçus par les joueurs car le client Flash les masque.

communication and internet network server roomLe premier constat est que sur un cloud toute opération disque devient une opération réseau car le stockage disque est fourni sous forme de service réseau de type EBS chez Amazon ou Azure Drives. Or la performance des bases de données dépend pour beaucoup des performances du stockage. Des défauts qui passent inaperçus sur des disques rapides locaux ressortent ici et sont difficiles à diagnostiquer car on raisonne toujours en volume d’écriture en mesurant la vitesse de transfert en bytes per second. Or c’est la latence du réseau qui bride le système pas le débit binaire du disque. C’est donc le nombre d’opérations, les IOPS qu’il faut surveiller. Elles plafonnent en général autour de 1000.

VenomLa deuxième recommandation est de diviser pour mieux régner. Les données sensibles comme les transactions financières sont restées sur un serveur SQL classique car il est impossible de garantir leur intégrité sur MongoDB. MongoDB est utilisé là où la souplesse du modèle est utile. Pour les données stockées dans MongoDB, Pierre Couzy recommande de partager les données entre plusieurs bases en fonction de leur cycle de vie pour pouvoir faire des optimisations plus agressives. Dans le cas du jeu, les données sont classées en trois catégories, l’état du jeu relativement stable, les données sociales assez volatiles, et des verrous logiques dont la durée de vie est très courte. Une des raisons de ce découpage est qu’il n’est pas utile de stocker physiquement des données à durée de vie très courte, l’autre est que les ralentissements sur les verrous doivent être absolument évités car ils ralentissent tout le reste du jeu.

Un troisième constat est que le multi-instance n’est pas la panacée. Lorsque l’instance MongoDB atteint sa limite de capacité, la première idée est de répartir la charge sur plusieurs instances. Mais une instance unique est plus efficace qu’une des instances du cluster. La réplication avec chacune des  autres instances mobilise une partie des ressources, à peu près autant que les écritures primaires dans ce cas. Elle entraîne aussi des risques d’incohérence qui demandent des mécanismes de contrôles eux-aussi coûteux. La réplication sur les 3 instances pendant que le jeu est à pleine charge prend des jours et peut pénaliser les temps de réponse du jeu. Les journaux de réplication dépassaient leur taille limite ce qui créait d’autres problèmes. A contrario, une instance unique peut se limiter au strict nécessaire sans Oplog et sans journalisation le temps de gérer l’installation en multi-instance. Risqué mais ça tient la charge. Mais attention, ces optimisations très agressives rendent le passage du cap vers le muti-instance encore plus difficile.

Infinity clock. Vector illustrationLe sharding nécessite aussi un peu de réflexion. Par défaut, la shard key est l’id généré par MongoDB. Cet id est monotone et les données nouvelles partaient sur la même partition. La bonne clé dépend du cycle de vie des données. Si ces données sont répliquées par la suite le problème n’est que transitoire. La solution retenue a été de transformer l’id et déplacer des caractères de la fin vers le début pour forcer la clé à changer rapidement d’ordre de grandeur.

funambuleLe réglage a été un processus incrémental. Viser un objectif pas trop haut, trouver la bonne configuration, puis augmenter la charge. Les tests de performance se sont avérés quasiment impossibles car ils ne reproduisaient pas la réalité correctement. Sur du cloud il n’est pas nécessaire de prévoir la capacité totale du système, elle peut être augmentée avec un peu d’anticipation. Pour cela, les logs, le monitoring et des représentations visuelles de l’usage des ressources sont indispensables.

Pierre Couzy recommande aussi de choisir la taille de machine en fonction du facteur limitant que l’on préfère subir. Les petites configurations sont limitées par la mémoire, les moyennes par la CPU, les grandes par le réseau. Il préfère la limitation par la CPU car elle est simple à monitorer et qu’elle cause moins d’effets de bord que la mémoire et le réseau. Toutefois, même dans ce cas la limite de capacité créera des timeouts et des effets de cascade car les clients recommencent faute de réponse rapide. La durée des timeouts tend à mettre le système en résonance ce qui est identifiable par des courbes en zigzag.

Nous voilà parés pour le backend. Et côté client quoi de neuf ?

Les nettoyeurs de code Android

Pierre-Yves Ricau et Alexandre Thomas  – Android Annotations 

logo AndroidAnnotationsPierre-Yves et Alexandre nous ont présenté Android Annotations, qui comme son nom l’indique permet de remplacer de la plomberie un peu systématique dans la programmation Android par des annotations.

Cette session est essentiellement basée sur une démo de code donc je ne rentrerai pas dans le détail, il faudra aller la voir 😉

Une partie des annotations remplace les déclaration et les initialisations des extras, des vues, des ressources via de l’injection de dépendance. D’autres annotations permettent de remplacer les AsyncTasks en déclarant simplement par une annotation si la méthode tourne sur l’UI Thread ou en background. Enfin les annotations qui ont éliminées le plus de code sont celles qui remplacent les classes anonymes des event handlers. A l’arrivée un code plus court, plus lisible et qui marche toujours (si si on a vérifié).

Le surpoids est assez faible car le framework sépare la librairie embarquée sur le device de la librairie qui gère la génération des classes supplémentaires pour le code généré. Au final, le framework rajoute une classe pour chaque classe annotée et un peu de code.

logo AndroidKickStartrAlexandre Thomas nous a aussi rapidement présenté Android KickstartR qui regroupe tout un tas de librairies couramment utilisées dans un même bundle et permet d’initier rapidement un projet Android.