La nouvelle API Hibernate Reactive 1.0 est la première version stable de l'API réactive pour le populaire Hibernate ORM, prenant en charge les pilotes de base de données non bloquants et un style d'interaction réactif avec la base de données.
Hibernate Reactive est une implémentation ORM conçue pour tirer parti des clients de base de données non bloquants. Les opérations sont construites sur des flux réactifs au lieu d'appels synchrones et représentées à l'aide du chainage d'interfaces Java CompletionStage
.
Les interactions avec la base de données, utilisant l'approche traditionnelle JDBC, JPA ou Hibernate ORM, sont synchrones et réalisées avec des invocations d'E/S bloquants. Ce n'est pas la meilleure solution pour une application réactive, où elle est privilégiée en tant que processus asynchrone et non bloquant.
Prêt à l'emploi, Hibernate Reactive prend en charge les clients Vert.x pour PostgreSQL, MySQL, DB2, SQL Server et CockroachDB. Un client Oracle est toujours en cours d'élaboration. Il est destiné à être utilisé dans un environnement réactif et est entièrement intégré aux frameworks Vert.x et Quarkus.
Les bases de données sont traditionnellement conçues pour être utilisées avec des appels bloquants, il n'est donc pas garanti qu'un style réactif puisse mieux fonctionner dans n'importe quelle situation. Dans un récent article de blog, Sanne Grinovero, team lead Hibernate, ingénieur fondateur de Quarkus chez Red Hat, a étudié quand il pourrait être utile de passer à Hibernate Reactive lorsque vous travaillez avec des bases de données relationnelles.
Sanne Grinovero a utilisé la suite TechEmpower sur plusieurs requêtes pour générer les données de réponse avec une latence (en ms) sous une charge élevée (requêtes par seconde) dans le tableau ci-dessous.
Il conclut :
Supposons donc que vous ayez un SLA qui vous oblige à fournir des réponses dans les 10 ms ; nous pouvons conclure qu'Hibernate ORM "classique" peut fonctionner dans les limites des exigences SLA tant que la charge sur cette seule machine ne dépasse pas cette limite de 20 000 requêtes/seconde - c'est assez décent, mais au-delà, la latence des réponses commence à se détériorer rapidement.
D'un autre côté, en utilisant Hibernate Reactive, nous semblons capables de fournir des réponses dans le même SLA de 10 ms, même lorsque la charge dépasse environ 35 000 requêtes/seconde. C'est clairement mieux - et par une marge significative.
Un autre benchmark démontre les améliorations de performances en comparant l'ancienne version bêta d'Hibernate Reactive avec la dernière.
Le graphique ci-dessous représente le débit par nombre de clients/threads.
Introduit pour la première fois en décembre 2020, Hibernate Reactive en est encore à ses balbutiements et quelques limitations subsistent actuellement par rapport à l'Hibernate ORM "classique", comme les annotations non prises en charge, Source
et CollectionId
. En attendant, son adoption pourrait être évidente pour les applications réactives car elle utilise le même paradigme.