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:
Fügen Sie mongodb-Sammlungen einen Listener hinzu, und wiederholen Sie Teile der Seite, wenn Änderungen an der Sammlung vorgenommen werden (Nachteile: langsam?)
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)
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!
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:
Und ehrlich gesagt ist es ziemlich beeindruckend, wie schnell es ist.
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.
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.
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.
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.