Frage Wie kann ich aktualisierte Datensätze in Echtzeit abrufen? (Mitteilungen?)


Ich versuche, eine Ruby-on-Rails-E-Commerce-Anwendung zu erstellen, in der potenzielle Kunden eine Bestellung aufgeben können und der Ladenbesitzer die Bestellung erhalten kann in Echtzeit. Die endgültige Bestellung wird in der Datenbank (im Moment SQLite) gespeichert, und der Ladenbesitzer wird ein Browserfenster geöffnet haben, in dem die neuen Bestellungen erscheinen, unmittelbar nachdem die Bestellung abgeschlossen ist. (Anwendungsinfo: Ich benutze das HOBO-Rails-Framework und plane, die App in Heroku zu hosten)

Ich denke jetzt über die beste Technologie nach, um dies zu implementieren, da erwartet wird, dass die Anwendung viele Benutzer mit vielen Bestellungen versorgt:

1) Jedes Browserfenster aktualisiert die Seite alle X Minuten und fragt den Server kontinuierlich nach neuen Datensätzen (neuen Aufträgen) ab. Das belastet natürlich den Server.

2) Wie oben, aber den Server mit einer Art AJAX-Framework abfragen.

3) Verwenden Sie eine Art von Server-Push-Technologie, wie "Kometen" asynchrones Messaging. Gefunden Juggernaut, nur Problem ist, dass es Flash und benutzerdefinierte Ports verwendet, und dies könnte ein Problem sein, wie meine App hinter Corporate Firewalls und NAT zugänglich sein sollte.

4) Ich überprüfe auch node.js Framework, scheint für diese Art von asynchronem Messaging effizient zu sein, obwohl es in Heroku nicht unterstützt wird.

Welcher ist der effizienteste Weg, um diese Art von Funktionalität zu implementieren? Gibt es vielleicht eine andere Methode, an die ich nicht gedacht habe?

Danke für deine Zeit und Hilfe!


6
2017-09-01 14:04


Ursprung


Antworten:


Node.js würde wahrscheinlich gut passen - es ist schnell, liebt Echtzeit und hat eine großartige Komet-Unterstützung. Der einzige Nachteil ist, dass Sie eine andere Technologie in Ihre Lösung einführen. Es macht einfach Spaß, in diesem Programm zu programmieren und viele Bibliotheken wurden von Rails und Sinatra inspiriert.

Ich weiß, dass Heroku eine Weile eine node.js-Beta ausgeführt hat und die Leute sie als Teil des letzten Knotenknockout-Wettbewerbs benutzten. Siehe diesen Blogbeitrag. Wenn das keine Option ist, können Sie es auf jeden Fall anderswo hosten. Wenn Sie es bei heroku hosten, können Sie möglicherweise Anfragen per Proxy senden. Andernfalls können Sie es problemlos von einer Subdomain aus ausführen, um Cookies zu teilen.

Auch Kasse socket.io. Es ist ein großartiger Job, den besten Weg zu wählen, Kometen basierend auf den Fähigkeiten des Browsers zu wählen.

Um Daten zwischen Knoten und Rails zu teilen, können Sie Cookies freigeben und dann die Sitzungsdaten in Ihrer Datenbank speichern, in die beide Anwendungen gelangen können. Eine komplexere Architektur könnte die Verwendung von Redis zum Veröffentlichen von Nachrichten zwischen ihnen beinhalten. Oder Sie können mit der Weitergabe von allem, was Sie in den HTTP-Anforderungen benötigen, umgehen.


3
2017-09-10 01:05



In HTTP können Anfragen nur vom Client kommen. Daher sind die besten Optionen, was Sie bereits erwähnt haben (Polling und HTTP-Streaming).

Polling ist die einfacher zu implementierende Option; es wird jedoch ziemlich viel Bandbreite benötigen. Deshalb sollten Sie die Anfragen und Antworten so klein wie möglich halten, also sollten Sie dafür XHR (Ajax) verwenden.

Ihre andere Option ist HTTP-Streaming (Comet); Es wird mehr Arbeit an der Einrichtung erfordern, aber Sie werden es vielleicht die Mühe wert finden. Du kannst Geben Echtzeit auf Schienen ein Schuss. Weitere Informationen und Tipps zum Verringern der Bandbreitennutzung finden Sie unter:

http://ajaxpatterns.org/Periodic_Refresh
http://ajaxpatterns.org/HTTP_Streaming


1
2017-09-01 14:14



Wenn Sie Ihren Ladenbesitzer Chrome ausführen lassen (andere Browser folgen in Kürze), können Sie WebSockets (nur für die Benachrichtigung des Geschäftsinhabers) verwenden. Dadurch können Sie eine ständige Verbindung öffnen, und Sie können Daten ohne den Browser an den Browser senden Browser, der irgendetwas anfordert.

Es gibt ein paar Websocket-Bibliotheken für node.js, aber ich glaube, Sie können es einfach selbst tun, indem Sie nur eine normale tcp-Verbindung verwenden.


0
2017-09-02 20:18