Dans la première partie nous avons vu comment il est possible de mettre à disposition des informations en temps réel à un ensemble de client à travers le concept de Pub/Sub.
Dans cette partie, nous allons voir de quelle manière Kuzzle résout certaines limites dues à l'utilisation du Pub/Sub grâce à son moteur de temps réel nouvelle génération.
Cet article fait partie d'une série sur le développement d'applications temps réel:
Pour remédier aux limites du Pub/Sub, nous avons implémenté notre propre moteur de temps réel, Koncorde, et nous l'avons directement branché sur notre base de données.
Avec Kuzzle, les clients ne s'abonnent pas à des canaux de communications mais à des modifications de la base de données.
Ainsi, il est possible de recevoir des notifications lorsqu'un document est créé, modifié ou supprimé sans avoir besoin de créer un canal de communication dédié.
Lorsqu'un client souhaite s'abonner à des notifications temps réel, il doit fournir le nom de l'index et de la collection contenant les documents qui l'intéressent. Il sera ensuite notifié lorsque des changements (ajout, modification, suppression) interviendront sur cette collection.
Prenons un exemple pour comprendre la différence avec le Pub/Sub.
Imaginons une application de suivi de conteneurs de fret, chaque conteneur possède une balise GPS IoT reliée à Kuzzle en MQTT et enregistre sa nouvelle position dans Kuzzle toute les 10 secondes pour conserver un historique.
Du côté de l'opérateur, une application web permet de visualiser la position des conteneurs sur une carte en temps réel.
Avec du Pub/Sub, la suite d’actions nécessaires est la suivante:
Avec Kuzzle, le principe est le même sauf qu’il n’y a pas besoin de publier manuellement la nouvelle position:
L’utilisation du protocol MQTT pour la balise GPS IoT et du SDK Javascript côté application web allège la quantité de code nécessaire côté client, mais surtout il n'y a aucune ligne de code côté serveur !
La mise à disposition en temps réel d'une information s'implémente uniquement du côté client sans avoir besoin d'intervenir sur le serveur.
J'ai évoqué la possibilité pour les clients de renseigner des filtres lors de l'abonnement aux notifications temps réel de Kuzzle.
À l'aide de ces derniers, vous pouvez filtrer finement les informations reçues en temps réel par les clients, toujours sans intervenir côté serveur.
Reprenons notre exemple d’application de suivi de conteneurs.
Tous les conteneurs enregistrent leurs nouvelles positions dans la même collection en spécifiant leur identifiant unique.
Côté application web, je souhaite afficher la position d'un seul conteneur.
Avec un filtre, je vais pouvoir indiquer à Kuzzle que je souhaite recevoir uniquement les notifications concernant le conteneur de mon choix.
const filters = { equals: { containerId: 'foobar' } }; await kuzzle.realtime.subscribe('containers', 'positions', filters, notification => { // Only notifications about the 'foobar' container });
Il est possible de recevoir uniquement les informations dont j'ai réellement besoin et toujours sans écrire une ligne supplémentaire côté serveur.
Si vous connaissez GraphQL, c'est le même principe. Le client demande au serveur uniquement les notifications dont il a besoin.
Nous avons développé un grand nombre de filtres différents et il est possible de filtrer tout ce que vous souhaitez en les combinant avec nos différents opérateurs.
Nous allons parler d’un type de filtre en particulier: les filtres de georepérage.
Ce type de filtre définit une zone géographique précise pour ensuite recevoir des notifications lorsque des documents localisés par une position GPS entrent ou sortent de cette zone.
Ces filtres peuvent prendre différentes formes, des cercles, des rectangles ou même le polygone de votre choix.
Revenons à notre monitoring de conteneurs.
Chaque opérateur étant responsable d'une zone particulière, l'application web doit être capable de ne montrer que les conteneurs de cette zone.
Il n'y a qu'à appliquer un filtre de géorepérage correspondant à la zone choisie et Kuzzle n'enverra que les nouvelles positions des conteneurs se trouvant à l'intérieur de cette zone.
const filters = { geoPolygon: { location: { points: [ [2.35107421875, 51.0275763378024], [-4.89990234375, 48.472921272487824], [-1.6259765625, 43.48481212891603], [3.01025390625, 42.48830197960227], [7.62451171875, 43.77109381775651], [8.173828125, 48.980216985374994], [2.35107421875, 51.0275763378024] ] } } }; await kuzzle.realtime.subscribe('containers', 'positions', filters, notification => { // Only notifications about containers in France });
Pour définir facilement vos polygones vous pouvez utiliser un site comme http://geojson.io/.
Avec Kuzzle, il est très simple de développer des applications temps réel embarquant des notions de monitoring ou d'alerting basées sur des positions géographiques.
Si le géofencing en temps réel vous intéresse, vous pouvez aller voir notre chaîne Youtube avec une vidéo sur le géomarketing en temps réel.
Comme vous le savez déjà peut-être, ici à Kuzzle nous accordons beaucoup d'importance à la performance de nos produits.
Notre moteur de temps réel, Koncorde, est lui aussi open-source et disponible sur Github.
Vous pourrez constater qu'une attention particulière a été portée à l'ensemble du code, notamment via des optimisations spécifiques par rapport au moteur Node.js ou par des modules natifs compilés en C.
Les benchmarks sur les filtres des notifications temps réel affichent des performances très élevées avec plusieurs dizaines de milliers d'opérations par seconde, même sur des filtres complexes tels que les filtres de georepérage.
Par exemple sur un laptop i5-7300U CPU @ 2.60GHz et 16GO de RAM, il est possible de monter jusqu’à 64 000 notifications/sec avec 10 000 clients connectés et un total de 100 000 filtres de géorepérage différents.
Dans le prochain article, nous aborderons les problématiques de performance et de scaling des applications impliquant un grand nombre d’utilisateurs de notifications temps réel. Cette fois je vous montrerai comment nous réalisons nos benchmarks plutôt que de vous tirer des chiffres de mon chapeau ;-)
À bientôt !