théorie des contraintes dont l’auteur principal est Eliyahu M. Goldratt) avec pour objectif de réduire les gaspillages. Trois exemples concrets : superviser en une ligne de shell avec ping et mailx (ça rappelle le Taco Bell Programming), automatiser la configuration système à l'aide de Puppet/Chef pour éviter les process complexes et interminables entre la commande et la livraison d'environnements configurées ou encore améliorer la stabilité du système par du test-driven infrastructure (ex: pre-commit hook SVN pour valider la conf réseau avant même de commiter, utiliser sentinel pour tester en continu l'état du réseau, etc.).
Distributed Data Grid et solutions NoSQL ont suivi des chemins différents mais adressent des sujets similaires. D’un côté, on est passé par la mémoire (shared memory), de l’autre par la parallélisation (shared nothing). D’un côté, le besoin d’optimiser la latence (une obsession dans le domaine financier), de l’autre, le besoin d’absorber des débits de requêtes de plus en plus importants, The End of an Architectural Era.
Alors certes, les Distributed Data Grid ont trouvé leur place dans le monde de la banque et NoSQL dans le monde du web. NetFlix nous a raconté sa stratégie et sa mise en oeuvre de migration vers AWS plutôt que de recontruire un nouveau Data Center. Les difficultés qu’ils ont rencontrés avec SimpleDB semblent corroborer ce qui est écrit dans ce papier. Bref, ce n’était pas de la publicité pour SimpleDB; bien au contraire et, à tort ou à raison, cela semble justifier leur choix de migrer vers Cassandra (et d’inverstir dans des nouveaux développements notamment au niveau des stratégies de réplication). Facebook nous a fait une présentation des travaux qu’ils réalisaient avec HBase. The Guardian, célèbre journal anglais, a mis en oeuvre MongoDB.
Des acteurs qui s’accordent sur le fait qu’il y a des manques tout de même : des APIs clientes encore trop simplistes (pas de timeout...), des limitations autour de l’upgrade du cluster sans interruption de services.... Reste que d’autres comme Twitter restent sur MySQL et semblent satisfaits . Nick Kallen démontre comment Twitter réalise le stockage des tweets, l’affichage de la timeline et la gestion du graph social dans MySQL (avec notamment l’utilisation de FlockDB ou Gizzard) en fonction des contraintes de performance. Pour info, on y retrouve quelques ordres de grandeurs qui permettent de positionner les contraintes auxquelles est soumise l’architecture : à titre d’exemple, 1100 tweets sont écrits par seconde. En revanche, la timeline sert 2,1millions de lectures par seconde (la timeline est pré-calculée et stockée dans memcached), et le graphe social doit gérer 20k modification / sec.
A noter que ce domaine est encore en pleine évolution. La preuve avec cette initiative intéressante de cela dépend des cas d’usage. Jusque là, “rien de génial” mais l’innovation dans ODC c’est que ce choix réplication vs. partitionnement, bien que définit par configuration en fonction de l’utilisation qui est faite de la donnée (type de requête...), n’impacte que le stockage de la donnée et absolument pas la modélisation qui peut rester relationnelle... Ainsi ODC, basée sur Cohérence, permet par configuration d’assurer ces deux modes de fonctionnement et du même coup de gérer des jointures, des indexations...
En somme, un domaine d’innovation si on le compare à celui des RDBMS mais qui trouve sa place, son terrain de jeu.
Une tendance intéressante qui part du constat que les évolutions d’infrastructure nous amènent à des serveurs pouvant proposer sans problème 50 Go de RAM voir plus. Or nos JVMs (enfin les Garbage Collector) ont bien du mal à dépasser les 3 ou 4 Go ce qui conduit inexorablement à une multitude de process en parallèle... avec ce que cela peut impliquer en terme de supervision. Azul propose sa JVM Zing qui inclue un GC sans pause. Il n'y a donc plus à avoir peur des minutes où le GC tournerait pour faire le ménage dand la heap d'une JVM de 100GB. La seule (grosse) limite actuelle de cette JVM est qu'il faut un noyau Linux patché ou exécuter son application dans une VM (au sens OS, pas une JVM). Dans ce dernier cas, la JVM est remplacée par une JVM proxy qui renvoie tout vers la JVM Zing présente dans une autre VM (Zing Virtual Appliance) avec un noyau patché. Terracotta propose des extensions à Ehcache; Big Memory, qui vise à contourner la JVM et à utiliser directement la RAM disponible pour stocker de l’information. BigMemory doit bien entendu être couplé à Terracotta Server qui va ainsi rajouter la couche “scalabilité” et persistence.
A commencer par Erlang; un langage fonctionnel pensé pour construire des applications concurrentes, distribuées et résilientes. Pour cela, il permet la création de processus légers (appelés acteurs) en taille mémoire nécessaire, en temps de création mais aussi en temps d'ordonnancement. Il est ainsi facilement envisageable d'avoir une application avec plusieurs centaines de millier de ces processus. Ces processus sont gérés (créés et schedulés) directement par la VM Erlang évitant ainsi les allers-retours entre le noyau de l'OS et l'espace utilisateur. La philosophie de la programmation par acteurs est "share nothing", contrairement à la programmation par threads. Chaque acteur communique alors avec les autres en envoyant des messages asynchrones et traite les messages reçus les uns à la suite des autres. Ces acteurs travaillent donc tous en parallèle sur plusieurs coeurs d'un même CPU et sur plusieurs CPU distribuées sur plusieurs machines. Enfin et concernant la résilience, en cas de “crash” d’un des processus, les processus préalablement liés sont notifiés et prennent la décision adéquate. Ainsi des patterns tel que "Supervisor & Worker" permettent de configurer une stratégie de redémarrage des workers (combien de redémarrage successif du même worker avant d'abandonner, relancer seulement le worker qui a planté ou l'ensemble des workers supervisés, …). En plus de cela, un certain nombre d'autres mécanismes tel que le déploiement à chaud d'une nouvelle version d'une application, l'activation de cette nouvelle version, le rollback à une version précédente, … apportent aux applications développées en Erlang une disponibilité maximale.
Ce type de programmation n’est pas sans inspirer le développement de nouveaux produits basés sur l’asynchonisme et des approches orientées évènements (type SEDA). Ces approches - à la Node.js , ou encore Tornado visent à dépasser le “C10k Problem” en découplant requête et réponse (qui sera traité dans une callback) et ainsi assurer une meilleure concurrence.
L'objectif de ces outils est ainsi de pouvoir supporter un très grand nombre de connexions simultanées (grand nombre de requêtes à la seconde ou grand nombre de connexions longues (ex: long polling, websocket, …)) et chacun y va de sa solution :
epoll()
par exemple) ou utilise le threading classique niveau OS lorsqu'un appel bloquant est obligatoire (accès fichier par exemple). A noter l’initiative de Basho, éditeur de Riak, qui a développé Web Machine ; un condensé d’HTTP.Au delà de la performance, un des challenge de ce type d’outil (contrairement à la programmation orientée acteur où le mindset, le paradigme est différent) concerne le développement : comment offrir des APIs qui fonctionnent en asynchrone même si le comportement est synchrone et qui n’impactent pas le code, sa lisibilité? quid de l’outillage, du debug etc...
A****lors la résilience a été au niveau langage avec des plateformes type Erlang qui ont fait leur preuve. La plateforme OTP (Open Telecom Platform) d'Erlang permet de construire une hierarchie de supervision de sous-systèmes à base d'acteurs (en s'appuyant sur le pattern "Supervisor & worker" précédemment décrit) capable de supporter le crash d'un sous-système et de se réamorcer. Ce guide présente plus en détail comment Erlang gère la résilience.
Au niveau des tests où l’on se rend compte que les tests de résilience arrivent très tôt dans le processus de développement, avant même les tests de performance qui nécessitent la mise en place d’infrastructure représentative (voire de réaliser des “parallel runs”)
Mais également au niveau delivery et déploiement avec Jez Humble : les “remediation patterns”. On y trouve des patterns comme :
Rien de nouveau mais ça va mieux en le disant :
“All architecture is design but not all design is architecture. Architecture represents the significant design decisions that shape a system, where significant is measured by cost of change.” Grady Booch
Concernant la qualité logicielle, un des sujets est certes de choisir les indicateurs mais surtout de choisir la représentation de ces derniers (et quelques part choisir les façons de communiquer qui seront les plus adaptées). Cela n’est pas sans rappeler le mouvement Data Visualization si cher à notre Joseph national (spécial dédicace :o) ). On utilisera alors à façon treemap facilitant la visualisation de la taille du code, la complexité cyclomatique ou encore des ratios nombre de LOC sur nombre de LOC de tests. A noter qu’il est possible de représenter le code sous forme de ville en 3D avec CodeCity.
Alors il y a du classique avec Spring 3.1, Servlet 3.1 ou encore Mono Cecil; une librairie .Net Open Source cross-platform (de .NET à WindowsPhone 7) permettant d’étendre les fonctionnalités de réflexion classiques de la plateforme .NET (par exemple sur les champs masqués derrière une propriété), mais également de manipulation de bytecode. Cela permet de coder simplement des fonctionnalités de type AOP par exemple.
Et du moins classique... Java est adopté dans des environnements sensibles à la performance comme la finance. StreamBase, un CEP haute fréquence implémenté en Java avec , il faut bien l’avouer, quelques optimisations ou spécificités, notamment sur la gestion du garbage collection ou la génération du bytecode avec Janino (un compilateur à la volée et en mémoire).... Cameron Purdy, ancien CEO de Tangosol et vice président de Oracle Fusion Middleware a également confirmé cette tendance en présentant plusieurs axes de travail (la sortie de ces travaux n’étant même pas encore confirmée) permettant à Java d'être plus performant (notamment sur la latence, cruciale dans le domaine financier). En bref, pour le moment de la pure R&D, qui sortirait peut-être dans une version 9 de Java, avec notamment
Mark S. Miller de Google a ainsi présenté les concepts qui sous-tendent la sécurité pour le cross-scripting de ECMAScript (JavaScript) 5. L'objectif est clairement de sortir d'une logique page web et de construire des objets JavaScript qui interagissent entre eux à travers Internet... Un objectif qui n’est pas sans rappeler la notion de “mashup” mais qui surtout nécessitent de repenser la Same Origin Policy.
Même Adobe se positionne sur HTML5 voyant là un standard permettant de cibler le plus grand nombre de plateformes. Cela commence par l’enrichissement de sa gamme de produit; DreamWeaver avec entre autre les nouvelles balises de Sections HTML5, Illustrator capable d’exporter les images en SVG ou Canvas via un plugin. L’apparition de nouveaux outils comme Wallaby confirme cette stratégie permettant aux éditeurs Flash de convertir leurs animations en HTML5 (ciblé bannières publicitaires pour compatibilité iPhone, iPad, etc.), mais aussi de futurs outils à surveiller comme le projet appelé “EDGE prototype” dont l’objectif est de fournir un outil dédié à la construction d’animations orientées timeline, entièrement HTML5 et Javascript, en partenariat avec JQuery. Flash reste dans cette vision la plateforme pour les fonctionnalités innovantes : Peer to Peer, collaboration ou encore 3D (Molehill par exemple).
Les frameworks légers type Camel, Spring Integration sont massivement utilisés notamment dans des contextes financiers à très fortes contraintes. John Davies nous a fait une magnifique explication de leur plateforme d’échange qui gère du multi-format, multi-version, du routage et de la conversion FIX, FpML, SWIFT à un niveau de performance impressionnant : 100 000 req/sec avec une latence < 10 ms. Il est clair que la notion Canonical Model a été bien challengé au profit d’un pattern qu’il appelle Integration Object. L’idée est en somme de gérer le routage et la mapping directement en Java (notamment via Jaxen, Saxonica...) et la persistence dans un cache type Coherence ou Gigaspace. En somme de l’ESB ultra léger sur un Data Grid.
Côté exposition de service, l’actualité est largement et encore tournée vers REST. Les maîtres mots étaient contrat minimaliste, souple, plutôt clé/valeur. Le principe REST de navigabilité des ressources trouve une utilisation dans la définition de workflow à travers l’implémentation du système Hypermedia (ici et ici)
Voilà ce que nous avions envie de retenir. Après comme dit l’autre :
“Prediction is very difficult difficult, especially about the future.” Niels Bohr