J'ai réfléchi à la façon de créer une application Web en temps réel en utilisant nodejs/socket.io/mongodb. L'idée est assez similaire à Google Docs, où les objets modifiés sur une page sont émis et restitués sur tous les navigateurs clients.
Quelle est la meilleure façon de procéder? D'après ce que j'ai lu, je peux penser à 3 façons:
Ajouter un "écouteur" aux collections mongodb, rendre à nouveau des parties de page chaque fois que des modifications sont apportées à la collection (contre: lent?)
Récupérer les données mongodb dans un fichier json, utiliser fs pour éditer, enregistrer sur mongodb et supprimer json une fois terminé (inconvénients: encombrant pour avoir une couche supplémentaire entre la base de données et l'application réelle)
Rendre sans stocker, enregistrer uniquement après que toutes les modifications ont été apportées (contre: les fichiers ne sont probablement pas rendus correctement dans tous les navigateurs)
Existe-t-il un meilleur moyen d'y parvenir? (Comment fonctionne Google Documents de toute façon?) J'apprécierais vraiment toute aide que n'importe qui peut offrir!
Nous avons construit une application en temps réel l'année dernière, essentiellement un outil permettant aux auteurs de travailler sur la même page où ils pouvaient ajouter/supprimer/modifier des éléments (texte, images, vidéos, etc.)
Nous avons utilisé:
Et honnêtement, sa vitesse est assez impressionnante.
Ceci est facile à résoudre sans trop de complications et à enregistrer des documents dans des bases de données. Vous ne devez enregistrer que les emplacements des documents. Node possède des fonctionnalités très impressionnantes conçues pour ce type d'applications. Je vous recommande de vous pencher sur ces sujets:
EventEmitters
Ruisseaux
Le système de fichiers du nœud possède des classes que vous pouvez utiliser pour créer ceci pour les documents:
Vous pouvez utiliser socket.io pour connecter ces événements à votre application cliente.
J'irais avec les options 1 et 3 mais avec une légère différence. 1. La première option pour suivre mongoDB opLog est une bonne option, mais les frais généraux deviennent très importants sur la base de données où votre application effectuera des millions de transactions. La bibliothèque meteorJS le fait déjà et vous pouvez les explorer car ils sont matures et stables à utiliser que d'écrire nos propres services.
Si je devais faire cela, j'utiliserais probablement un mélange. Redis ou rabbitmq pour gérer la liste des connexions socket.io pour obtenir le comportement de publication et d'abonnement aussi rapidement que possible, avec un travail de minuteur qui vide périodiquement les écritures du document dans le mongodb pour une persistance à plus long terme, bien que vous puissiez sans doute laisser tous les documents à Redis si vous vouliez.
"Construire une application collaborative d'édition de documents" est en fait un chapitre du livre "Mastering Node.js". Ils utilisent:
ShareDB est un backend de base de données en temps réel basé sur la transformation opérationnelle (OT) des documents JSON. Il s'agit du backend en temps réel du framework d'application Web DerbyJS. https://github.com/share/sharedb
Les vagues sont des documents hébergés et structurés qui permettent des modifications simultanées transparentes et à faible latence. Pour fournir cette expérience en direct, Google Wave utilise le cadre de transformation opérationnelle (OT) du contrôle des accès concurrents. https://svn.Apache.org/repos/asf/incubator/wave/whitepapers/operational-transform/operational-transform.html
Quill est un éditeur WYSIWYG moderne conçu pour la compatibilité et l'extensibilité. https://github.com/quilljs/quill
WebSocket et websocket-json-stream
Dépôt GitHub du code source complet: https://github.com/PacktPublishing/Mastering-Node.js-Second-Edition/tree/master/Chapter06/sharedb
En outre, MongoDB a récemment publié un livre blanc sur le streaming de données avec Apache Kafka pour obtenir des capacités en temps réel: https://webassets.mongodb.com/kafka_and_mongodb.pdf