Cette année à Devoxx au rayon Big Data on pouvait assister à la présentation de Datomic, une base de données NoSQL. Voici ce qu’elle recèle.

Conçue depuis 2012 par Rich Hickey, Datomic se veut une base simple, transactionnelle, distribuée, flexible, évolutive, taillée pour les architecture cloud. Cette dernière se présente de la façon suivante :

datomic

Derrière ce schéma un peu barbare, retenons que Datomic se base sur 3 concepts

  • Peer

Correspond à une librairie installable coté serveur d’application. Il sert de passerelle avec le reste de la base : soumet les transactions et reçoit les changements du Transactor. Il fournit également la couche d’accès aux données, un système de cache et un moteur de requêtes (Datalog). Il gère toutes les communications utiles pour la connexion au Transactor et systèmes de stockage ainsi qu’avec le Datalog. Dernier point le Peer peut se lancer en mode standalone en utilisant une base montée en mémoire.

  • Transactor

est unique (1 seul processus) et est obligatoire dès que le nombre de Peer est supérieur à 1 ou qu’il exploite un service de stockage. Il est chargé de recevoir et de coordonner les changements par ordre chronologique. De ce fait Datomic répond aux principes ACID des transactions. Il transmet les changements aux Peers et s’occupe de l’indexation via un processus d’arrière-plan.

  • Stockage

Peut être un service interne ou externe. Pour un service externe Datomic est capable de se brancher avec DynamoDB, Riak, Cassandra, Couchbase, Infinispan ou une base SQL comme PostgreSQL.

Après l’architecture attardons nous sur la philosophie de Datomic. Rich Hickey est parti du constat que les bases de données relationnelles qu’on connait se repose sur un modèle sensiblement dépassé. En effet cette représentation des données a vu le jour il y a quelques dizaines d’années où les contraintes en terme de stockage étaient fortes, ce qui n’est plus le cas aujourd’hui.

L’idée était d’abandonner la méthode de Place-oriented Programming (trouve puis écrase la valeur) historique pour mettre en place une gestion des faits. Datomic se base sur des faits (qui a dit Memento ?)

Mais qu’est-ce qu’un fait ? Un fait est :

  • Immuable

  • Atomique (concerne un seul élément)

  • Temporel

Avec Datomic un fait se nomme un « Datom », un Datom correspond à

  • Entité

  • Attribut

  • Valeur

  • Transaction (correspond à un temps base)

  • Opération

A travers ses Datoms, Datomic est construit sur un unique schéma de table (se rapprochant des modèles schemaless): la notion de base de données est donc l’ensemble des datoms enregistrés. Dans la dernière version le nombre maximum de datoms est de 10 milliards par base.

Revenons sur un détail : un fait est immuable. Vous vous dites comment une donnée peut être immuable, est-il impossible de changer les faits ? Dans ce cas oui puisque que les faits sont associés à une temporalité : Tim Cook est devenu le président d’Apple, ça ne veut pas dire pour autant que Steve Jobs n’a jamais été président d’Apple. Ainsi une modification est réalisée par l’ajout d’un nouveau fait (ici par exemple pour répondre à la question « qui est le président d’Apple ? « ). En ce qui concerne la suppression, celle-ci se fait de manière logique par le biais du booléen Opération du modèle de données.

Nico, aime, pizza, 1001, true

Nico, aime, biere, 1001, true

Nico, aime, vodka-martini, 1001, true

Nico, aime, ginto, 1002, true

Nico, aime, biere, 1002, false

On peut voir l’ajout de faits dans Datomic comme la croissance d’un arbre, chaque transaction est un anneau de l’arbre. Ce qui amène à l’une des spécificités de Datomic, il est possible de revenir à l’état exact de la base de données (à une transaction donnée) : Datomic permet le voyage dans le temps.

Datomic propose un système de covering index c’est-à-dire que le contenu des 5 colonnes est indexé. Le Transactor se charge d’actualiser les index et les données indexées sont poussées aux Peers pour exploitation dans leur cache et l’exécution des requêtes.

Quelques spécificités supplémentaires :

  • Datomic supporte Datalog comme langage de requêtage

  • La possibilité de faire des transactions spéculatives c’est-à-dire de ne pas les envoyer au Transactor. Les modifications apportées sont visibles uniquement en local

  • Grâce à son architecture, les lectures sont dissociées des écritures.

Datomic propose une gestion simple de données temporelles avec une forte évolutivité de capacité de lectures tout en garantissant une gestion transactionnelle des données. Il limite également toute une partie du traffic réseau avec sa gestion locale de cache et de requêtes. Ce dernier point amène aussi un inconvénient majeur puisque en raison de ses caractéristiques ACID la montée en charge en terme d’écriture risque d’être sensible et complexe comparé à d’autres solutions NoSQL.

Datamic trouvera donc un intérêt pour toute application de gestion avec un fort besoin de rapidité de réponse. Le meilleur cas reste quand même le besoin d’historisation des données puisque l’architecture Datomic est idéalement taillée pour.