Verwirrt über Meteor: Wie kann man Daten an alle Clients senden, ohne in die Datenbank zu schreiben?

8

Ich habe jetzt schon ein bisschen mit Meteor gespielt, aber mir ist klar geworden, dass mir noch einiges (oder viel!) Verständnis fehlt.

Hier ist zum Beispiel ein Tutorial, das node.js / express / socket.io verwendet, um einen einfachen Echtzeit-Chat zu erstellen: Ссылка

In diesem obigen Beispiel empfängt der Webserver über socket.io einige Daten und gibt sie an alle verbundenen Clients weiter - alles ohne Datenbankzugriffe.

Bei Meteor werden Clients in allen Beispielen, die ich gesehen habe, aktualisiert, indem sie an den mongodb schreiben, der dann alle Clients aktualisiert. Was aber, wenn ich keine Daten in die Datenbank schreiben muss? Es scheint ein teurer Schritt zu sein, um Daten an alle Clients zu übermitteln.

Ich bin sicher, dass ich hier etwas verpasse. Was wäre die Methode von Meteor, alle Clients zu aktualisieren (zum Beispiel mit einer einfachen Chat-App), aber ohne die Kosten für das Schreiben in eine Datenbank zu benötigen?

Danke!

    
kurisukun 23.07.2013, 12:49
quelle

4 Antworten

10

Im Moment gibt es keine offizielle Möglichkeit, Daten an Kunden zu senden, ohne sie in eine Sammlung zu schreiben. Es ist ein kleiner Trick in Meteor, weil der Schritt, Daten an mehrere Klienten zu senden, wenn es keinen Platz gibt, um zu schreiben, von kommt, wenn mehrere Meteore zusammen benutzt werden. Das heißt, Gegenstände, die von einem Meteor gesendet werden, kommen nicht zu den Kunden, die auf dem anderen abonniert sind.

Es gibt eine temporäre Lösung mit Meteor Streams ( Ссылка ), mit denen Sie tun können, was Sie wollen, ohne zu schreiben zur Datenbank in der Zwischenzeit.

Es gibt auch eine ziemlich ausführliche Diskussion darüber auf Meteor-Talk ( Ссылка ) ) wenn Sie einige der technischen Details verstehen möchten. Dies wird tatsächlich möglich, wenn der Linker-Zweig in Master für einen einzelnen Server zusammengeführt wird

Hier ist ein bisschen Weg, um eine virtuelle Sammlung zu haben, es ist nicht perfekt, aber es kann tun, bis Meteor eine bessere Art hat, es zu tun.

%Vor%

Dann abonnieren Sie dies auf dem Client:

%Vor%

Dann könnten Sie das ausführen, wenn das Abonnement abgeschlossen ist:

%Vor%

Dies ist ein bisschen unordentlich, aber Sie könnten auch darin einhaken, um Sammlungen zu aktualisieren oder zu entfernen. Zumindest auf diese Weise werden Sie keine Plugins oder Pakete verwenden.

Siehe: Ссылка für weitere Details und ein Video Beispiel.

    
Akshat 23.07.2013, 13:02
quelle
6

Die Veröffentlichungsfunktion auf dem Server sendet Daten an Clients. Es hat einige praktische Verknüpfungen, um Abfrageergebnisse aus der Datenbank zu veröffentlichen, aber Sie müssen diese nicht verwenden. Die Veröffentlichungsfunktion enthält this.added (), this.removed () und this.changed (), mit denen Sie beliebige Elemente veröffentlichen können. Der Client abonniert dann und erhält die veröffentlichten Daten.

Zum Beispiel:

%Vor%

Es gibt ein Beispiel in Meteordokumentationen hier und ein anderes Beispiel hier . Ich habe auch ein Beispiel , das Daten zwischen Clients teilt, ohne jemals eine Datenbank zu verwenden, nur um mir beizubringen, wie das Publish und das Subscribe funktioniert. Nichts verwendet, aber grundlegende Meteor.

    
user728291 24.07.2013 11:17
quelle
3

Es ist möglich, das Meteor-Paket (ihre DDP-Implementierung) zu verwenden, ohne dass eine Datenbank auf dem Server benötigt wird. Dies wurde von Avital Oliver vorgeführt und unten werde ich auf den entsprechenden Teil hinweisen.

Die Magie passiert hier:

%Vor%

Einstellung connection: null gibt keine Verbindung an (siehe Meteor Dokumente).

Akshat schlug vor, Streams zu verwenden. Ich kann auf seinen Kommentar wegen fehlender Reputation nicht antworten, also werde ich das hier machen. Das Paket, zu dem er verlinkt, wird nicht mehr aktiv gepflegt (siehe Tweet ). Ich empfehle stattdessen, das Paket yuukan: streamy (lese es auf Atmosphere) zu verwenden oder benutze die zugrundeliegende SockJS-Bibliothek, die in Meteor selbst verwendet wird - du kannst lernen, wie du dies durchführst, indem du den Meteor-Code durchschaust und siehst, wie Meteor.server.Stream_server und Meteor.connection._stream wird verwendet, was das Streamy-Paket tut.

Ich habe eine Implementierung des Streamy-Chat-Beispiels getestet und festgestellt, dass die Leistung vernachlässigbar unterschiedlich ist, aber dies war nur bei rudimentären Tests der Fall. Mit dem ersten Ansatz erhalten Sie die Vorteile der Minimongo-Implementierung (z. B. Finden) und Meteor-Reaktivität. Reactivity ist mit Streamy möglich, obwohl dies durch Dinge wie die Verwendung von ReactiveVars möglich ist.

    
Jesse 10.03.2015 11:27
quelle
1

Es gibt einen Weg! Zumindest theoretisch Das von Meteor für die Synchronisation zwischen Client und Server verwendete Protokoll heißt DDP. Die Spezifikation ist hier

Und obwohl einige Beispiele hier und hier von Leuten, die ihre eigenen DDP-Clients implementieren, habe ich leider keine Beispiele für Implementierungen von DDP-Servern gesehen. Aber ich denke, das Protokoll ist einfach und würde vermuten, dass es nicht so schwer umzusetzen wäre.

    
Jonathan Warden 24.07.2013 19:32
quelle

Tags und Links