Echtzeit-Web-Apps mit mongodb und nodejs

9

Ich habe darüber nachgedacht, wie man eine Echtzeit-Webanwendung mit nodejs / socket.io / mongodb erstellt. Die Idee ist Google Docs sehr ähnlich, wo auf einer Seite bearbeitete Objekte in allen Client-Browsern ausgegeben und neu gerendert werden.

Was ist der beste Weg, dies zu tun? Von dem, was ich gelesen habe, kann ich mir 3 Wege vorstellen:

1) Verwenden von mongodb oplogs

Fügen Sie mongodb-Sammlungen einen Listener hinzu, und wiederholen Sie Teile der Seite, wenn Änderungen an der Sammlung vorgenommen werden (Nachteile: langsam?)

2) Verwendung von lokalem json

Abrufen von Mongodb-Daten in JSON-Datei, Verwenden von fs zum Bearbeiten, Speichern in Mongodb und Löschen von JSON, wenn Sie fertig sind (Nachteile: umständlich, zusätzliche Ebene zwischen Datenbank und aktueller App zu haben)

3) Verwendung von rein socket.io

rerender ohne Speichern, speichern Sie erst, nachdem alle Änderungen vorgenommen wurden (Nachteile: Dateien wurden wahrscheinlich nicht in allen Browsern richtig dargestellt)

Gibt es einen besseren Weg, dies zu erreichen? (Wie funktioniert Google Docs überhaupt?) Würde wirklich jede Hilfe schätzen, die jemand anbieten kann!

    
Poh Zi How 29.12.2016, 20:14
quelle

5 Antworten

12

Wir haben letztes Jahr eine Echtzeit-App erstellt, im Grunde ein Werkzeug, mit dem Autoren auf derselben Seite arbeiten können, wo sie Elemente (Text, Bilder, Videos, etc.) hinzufügen / entfernen / bearbeiten können.

Was wir benutzt haben, waren:

  • Node.js, mit Hapi.js Framework (expressbasiert)
  • Socket.io
  • Nein MongoDB, aber stattdessen die ehrfürchtige RethinkDB , die standardmäßig in Echtzeit verwendet wird und grundsätzlich Listener verwendet, um es Ihnen zu sagen wann immer sich etwas geändert hat. (mongoDB ist unserer Meinung nach scheiße, wir haben es in der Vergangenheit benutzt und es fühlt sich an wie "nie wieder", aber das ist unsere Meinung)
  • React / Redux, um das DOM nur für Elemente zu aktualisieren, die sich geändert haben, Angular mit seinen beiden Wegen hätte unserer Meinung nach nicht gut funktioniert, da mehrere Benutzer die gleiche Seite zur gleichen Zeit ändern könnten und daher re - Wenn alle Elemente gerendert würden, würde der Fokus verloren gehen.

Und ehrlich gesagt ist es ziemlich beeindruckend, wie schnell es ist.

    
Vadorequest 05.01.2017, 09:24
quelle
2

Dies ist leicht zu lösen, ohne viel Aufwand und Dokumente in Datenbanken zu speichern. Sie sollten nur Dokumentspeicherorte speichern. Node hat einige sehr tolle Funktionen für diese Art von Anwendungen. Ich empfehle Ihnen, sich folgende Themen anzusehen:

  • EventEmitter

  • Streams

Node-Dateisystem verfügt über Klassen, die Sie verwenden können, um dies für Dokumente zu erstellen:

Sie können socket.io verwenden, um diese Ereignisse mit Ihrer Client-Anwendung zu verbinden.

    
Sulejman Sarajlija 29.12.2016 21:24
quelle
2

Ich würde mit Option 1 & amp; 3 aber mit geringfügigem Unterschied. 1. Die erste Option, um mongoDB opLog zu beenden, ist eine gute, aber der Overhead wird sehr groß in der DB, wo Ihre App Millionen von Transaktionen machen wird. Die meteorJS-Bibliothek tut dies bereits und Sie können sie erkunden, da sie ausgereift und stabil zu verwenden sind, anstatt unsere eigenen Dienste zu schreiben.

  1. Option 3, um socket.io zu verwenden. Sie können socket.io tatsächlich für das Veröffentlichen von Änderungen sowie das Schreiben in die Datenbank verwenden, wenn Sie rethinkDB verwenden, das systemeigene Änderungsfeeds unterstützt. Native changesfeeds bedeutet, dass jedes Mal, wenn ein Schreibzugriff auf die Tabelle / Sammlung besteht, die Sie in Echtzeit sehen möchten, ein Rückruf mit den alten und neuen Daten erfolgt, wo Sie socket.io für die Veröffentlichung auf allen Clients verwenden können.
  2. Eine andere Möglichkeit, dies zu tun, ist eine robustere Lösung, die rabbitMQ verwendet, wie Paul oben erwähnt hat.
Bala Abhinav 05.01.2017 09:05
quelle
1

Wenn ich das tun würde, würde ich wahrscheinlich eine Mischung verwenden. Redis oder rabbitmq zur Verwaltung der socket.io-Verbindungsliste, um das Veröffentlichungs- und Abonnementverhalten so schnell wie möglich zu erhalten, mit einem Timer-Job, der regelmäßig die Schreibvorgänge des Dokuments für längerfristige Persistenz in den mongodb schreibt, obwohl Sie möglicherweise alle Dokumente belassen in Redis, wenn Sie wollten.

    
Paul 29.12.2016 20:21
quelle
-2

Ich denke, Daten mit socketIO zu synchronisieren ist der beste Weg ... Senden Sie Daten an Mongo mit einem emit. Achten Sie auf Änderungen in der Datenbank mit dem Socket und wiederholen Sie Ihre Seite mit diesen Änderungen.

Sie können auch nodejs realtime mongodb besuchen! um zu sehen, wie Daten automatisch mit regina synchronisiert werden.

    
tutanck 18.10.2017 23:11
quelle