web-dev-qa-db-fra.com

Applications Web en temps réel avec mongodb et nodejs

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:

1) Utilisation des oplogs mongodb

Ajouter un "écouteur" aux collections mongodb, rendre à nouveau des parties de page chaque fois que des modifications sont apportées à la collection (contre: lent?)

2) Utilisation de json local

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)

3) Utilisation purement socket.io

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!

17
Poh Zi How

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é:

  • Node.js, avec le framework Hapi.js (basé express)
  • Socket.io
  • Non MongoDB mais le génial RethinkDB à la place, qui est en temps réel par défaut et utilise essentiellement des écouteurs pour vous dire chaque fois que quelque chose a modifié. (mongoDB est nul à notre avis, nous l'avons utilisé dans le passé et c'est comme "plus jamais", mais c'est notre avis)
  • React/Redux afin de mettre à jour le DOM uniquement pour les éléments qui ont changé, Angular avec ses deux sens n'aurait pas bien fonctionné à notre avis, car plusieurs utilisateurs peuvent modifier la même page à en même temps et donc un nouveau rendu de tous les éléments entraînerait une perte de focus.

Et honnêtement, sa vitesse est assez impressionnante.

21
Vadorequest

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.

3
Sulejman Sarajlija

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.

  1. Option 3 pour utiliser socket.io. Vous pouvez réellement utiliser socket.io pour publier les modifications ainsi que pour écrire dans la base de données si vous utilisez rethinkDB qui prend en charge les flux de modifications natifs. Les changements natifs signifient que, chaque fois qu'il y a une écriture dans la table/collection que vous souhaitez regarder en temps réel, il donne un rappel avec les anciennes et nouvelles données où vous pouvez utiliser socket.io pour publier sur tous les clients.
  2. Une autre façon de le faire, qui est une solution plus robuste, utilise rabbitMQ comme Paul l'a mentionné ci-dessus.
2
Bala Abhinav

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.

1
Paul

"Construire une application collaborative d'édition de documents" est en fait un chapitre du livre "Mastering Node.js". Ils utilisent:

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

1
Jan