L'objectif du Domain-Driven Design est de décomposer un domaine métier complexe en éléments faciles à manipuler, en prenant en compte les besoins de scalabilité et de cohérence. Combiné à CQRS, il est possible de construire des plate-formes applicatives s'appuyant sur des concepts comme les Bounded Contexts, les périmètres transactionnels et les communications à base d'événements. Pawel Kaczor a initié une série d'articles en trois parties décrivant la construction d'une application réactive utilisant ces concepts avec Akka, la plate-forme open-source pour applications pilotées par les événements.
Pawel, qui est un consultant impliqué dans CQRS et Scala, affirme que la cohérence garantie par des transactions globales est un besoin artificiel, qui ne correspond à aucune exigence réelle même dans le cadre de systèmes d'entreprise. Pour bénéficier pleinement d'une architecture DDD/CQRS, il suggère certaines technologies sur lesquelles s'appuyer : des bases NoSQL pour le stockage et Akka, dans le cas où l'on se trouve en environnement JVM. Un module de persistance récemment publié permet d'assurer la persistance des processus, ce qui, pour Pawel, permet de considérer Akka comme une plate-forme de construction d'applications d'entreprise.
L'exemple que donne Pawel commence par la construction de la racine d'un agrégat (Aggregate Root) utilisant l'Envent Sourcing avec Akka. Un Aggregate Root devrait être modélisé comme un acteur Stateful qui, de façon asynchrone, accepte des commandes et produit des événements. Quand une commande est acceptée, un message d'événement représentant la réception de cette commande est produit et, une fois que la persistance de cet événement a été effectuée, un message d'acquitement est retourné puis l'événement propagé.
Dans Akka, un acteur est créé par un autre acteur, qui devient son superviseur. Ce pattern de supervision signifie que l'interaction d'un client peut être simplifiée en utilisant un unique acteur pour la création des acteurs de racines d'agrégats. Pour la fin du cycle de vie, un acteur ayant terminé son traitement et étant devenu inactif devrait demander à son parent d'être éliminé ou arrêté.
Du côté Query, Pawel implémente l'infrastructure nécessaire au travail avec les projections. Deux modules Akka sont disponibles : Akka Persistence, signalé comme étant à l'état expérimental et supportant le concept de projection, et Akka Streams, actuellement en cours de développement et implémentation du standard récemment annoncé pour le traitement de flux asynchrones sur la pate-forme JVM.
Pawel a mis les sources de son exemple à disposition sur github.