Echtzeit-server-push mit Sockel IO (oder Strophe.js), XMPP und Django
Habe ich ein paar von Android-und iOS-native mobile Anwendung, die ich geschrieben habe, die direkt eine Verbindung zu einem XMPP-server, die ich Gastgeber. Sie push-und pull-Echtzeit-Daten über XMPP. Ich benutze auch einige der XMPP XEP-Erweiterungen. Für andere Vorgänge, ich habe eine django-Anwendung auf dem gleichen server ausgeführt, die alle mobilen Anwendungen verbrauchen über eine HTTP-REST-Schnittstelle. Ich verwende Sellerie und Redis für die django-Seite, um einige Vorgänge asynchron (wie große Batch schreibt mit meiner db).
Das alles funktioniert schön und gut. Yay.
Aber jetzt will ich schreiben, ein web-front-end-all dies, so dass ich begann die Erforschung mein Optionen und gut - es gibt so viele Möglichkeiten, um die Haut der Katze, die ich testen wollte, mit dem, SO die Gemeinde.
Die Idee, eine js-Bibliothek, das gibt mir eine einheitliche API für socket-Kommunikation (ich.e versuchen, verschiedene Implementierungen von web sockets oder fallen zurück in den flash -) gefällt mir, also warum ich erwähnen, Socket IO. Die Idee, dass ein nodejs server, naja, nicht so viel (der eine mehr, was zu lernen), aber wenn ich muss, ich auf jeden Fall. Ich weiß, dass einige Leute benutzen gevent als Ersatz für den node-server. Andere, entscheiden, schreiben einen kleine nodejs denen Sie eine Verbindung herstellen, um den rest Ihres Stacks. Wahrscheinlich würde ich dies tun.
Weitere option ist der Einsatz eines js XMPP-Bibliothek wie Strophe was ich nicht denke, es hat einen flash-fallback. Außerdem würde ich brauchen, um Forschung, was bedeutet das für meinen server.
Habe ich gelesen, einige Stackoverflow-Antwort, wie Kometen-und django - also, warum es scheint, dass es mehrere Optionen.
Die Frage ist:
, Wenn ich den Vorteil von Socket-E /a-Verhalten (mit den fallbacks) und ich möchte die push-Echtzeit-Daten an den web-client (wird zugeführt, um den server über XMPP), und mit Django, was ist meine beste option?
Update: Der XMPP-server, den ich verwenden, ist ejabberd, die auch unterstützt BOSH. Ich merke, dass ich verwenden könnte, Strophe.js und damit meine Kommunikation gehen würde, über eine Art von long-polling http-Verbindung statt websockets. Soweit ich das beurteilen kann, gibt es einige XMPP über Websockets open-source-Bibliothek, aber AFAIK die community nicht so aktiv wie die SocketIO ein.
Update 2: Browsern, die ich brauche, um zu unterstützen nur moderne Browser. Ich denke, das bedeutet, dass Flash-fallback wird nicht so wichtig sein, das beugte mich zu strophe.js.
- Es gibt socket.io-server-Implementierungen in othere Sprachen als js. Knoten ist nur der Referenz-server. Ich habe eine Steckdose.io-server mit go-Buchse.io, geschrieben in Go. Python hat TornadIO2, die verwendet tornado in seinem stack.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht sicher, warum würden Sie brauchen, Flash-fallback, wenn du gehst zu tun BOSH (XEP-0124, XEP-0206), was strophe.js tut. Wenn Sie nicht brauchen, um Unterstützung für den IE7, die Sie tun können, CORS aus strophe.js und Sie brauchen noch nicht einmal ein proxy für gleichen Ursprungs. IE6 funktionieren wird, weil es unsicher ist, und IE8+ Unterstützung einer just-kaum-arbeiten in form von CORS.
Um Informationen von django über XMPP zu Ihr-client, stellen Sie eine component-Verbindung (XEP-0114) zu Ihrem server mit Ihrem Lieblings -Python-XMPP-Bibliothek, wie SleekXMPP aus Ihre Django-app. Vereinbaren Sie für diese Verbindung relativ lange gelebt, für die Leistung (d.h. nicht einen neuen erstellen für jede client-Verbindung). Senden-Protokoll benötigt.
Du nicht erwähnt, was XMPP-server, den Sie verwenden. XMPP-Server, die keine Unterstützung BOSH sind immer selten, aber wenn Sie eines haben, müssen Sie möglicherweise Punjab als ein BOSH-zu-XMPP-proxy, oder möchten Sie vielleicht zu wechseln eine neuere server, wie Prosodie.
Ich denke, wenn Sie Ihre Hände schmutzig mit einigen Knoten werden Sie feststellen, dass Sie zerstreut von Knoten für die Steckdose.io wird sehr viel schwieriger sein. Es gibt sehr einfach zu bedienen xmpp-Module in Knoten bereit zu gehen (siehe https://github.com/astro/node-xmpp). Denken Sie daran, Knoten alle javascript, so sind Sie wahrscheinlich vertraut mit der Programmierung in es bereits.
Persönlich, ich habe einige memory-leak-Probleme mit Knoten von 0,6 oder höher. Knoten 0.4 gearbeitet, ohne diese Probleme. Wenn Sie neu auf github (da war ich vor dem spielen mit Knoten) hier ist, wie würden Sie gehen mit einem Knoten-server.
Erste Knoten
Müssen Sie bestimmte Entwicklungs-tools, es zu bauen, wie g++, aber an diesem Punkt haben Sie eine funktionierende
node
Befehl.Installieren von Node-Modulen wie z.B. xmpp
Knoten hat eine schöne Menge von Modulen, wo die meisten Dinge sind bereits für Sie geschrieben. Es gibt eine Suchfunktion, bei http://search.npmjs.org oder Sie können Zugriff auf alle Module, die direkt aus der shell mithilfe der
npm
Befehl. NPM ist Knoten-tool zum installieren und verwalten von node-Modulen. Geben Sienpm search xmpp
Suche für alle xmpp-Module, zum Beispiel. Installieren Sie ein basic-xmpp-Bibliothek für den Knoten, den Sie tun würdenpm install node-xmpp
. Übrigens, die meisten github-Knoten Modul-Seiten enthalten Anweisungen, die auf der Titelseite readme-Datei.Halten Knoten in der Produktion Laufen
Dieser warf mich, als ich anfing. Wenn Sie irgendwelche Fehler, die nicht gefangen Knoten wird einfach sterben. So können Sie entweder
1. Stellen Sie sicher, es gibt keine Fehler, was auch immer oder Sie werden alle gefangen sind (unwahrscheinlich, da auch Knoten selber Fehler)
2. Verwenden Sie die uncaughtException-handler fangen diese Probleme. Verwenden Sie code wie diesen in Ihr Programm
Werden Extra Sicher und für Immer Verwenden
Sogar mit der uncaughtException Ausgabe Ihres Programms in der Produktion sterben könnten. Speicher läuft aus, segfaults, wer weiß was. Das ist, wo es sich lohnt, etwas zu verwenden, wie das wunderschöne Node-Modul namens "Forever" (siehe https://github.com/nodejitsu/forever). Geben Sie
npm install forever -g
zu installieren für immer. Hinweis: die option-g, die steckt immer in den GLOBALEN Knoten-Modul-Verzeichnis. Ohne -g stellt das node-Modul in das aktuelle Arbeitsverzeichnis. Sie werden dann in der Lage sein, etwas zu geben wie (vorausgesetzt, Ihr Knoten-Programm aufgerufen wurde my_program.js)forever start my_program.js
- und dann das für Immer Programm stellen Sie sicher, dass wenn es stirbt, wird es neu gestartet.Erstens, die vollständige Offenlegung: ich arbeite für eine Firma namens PubNub, die werde ich kurz erwähnen.
Gibt es eine ganze Reihe von hosted bidirektionale messaging-Dienste (manchmal auch als IaaS - Infrastructure as a Service), dass ich denke, sind eine überlegung Wert. Sie sind Pusher, FB, Flotype, PubNub, und andere. Ich bin Recht zuversichtlich sind, Sie können jede von Ihnen für das, was Sie erreichen möchten. FB hat eine integrierte Datenbank, die Beziehungen in den Dienst, das ist ein ziemlich cooles feature, aber wohl nicht sinnvoll für Ihren Anwendungsfall (ich nehme an, Sie haben bereits eine Datenbank auf dem backend).
Kann ich nicht sprechen, zu stark über unsere Wettbewerber, aber so weit, wie Sie wollen, eine JavaScript-Bibliothek auf dem frontend kommuniziert mit Ihrem Python-backend, wir (PubNub) bieten eine sehr ähnliche api, die in beiden Sprachen und kommunizieren auf dem gleichen Datenbus in der cloud. So können Sie das senden von Nachrichten mit Python und fangen Sie Sie mit JavaScript, oder Umgekehrt. Wir schrieb sogar ein PubNub-hosted-version von socket.io, die Sie verwenden könnten, statt unsere vanilla-JavaScript-api, und würde noch Krawatte in Ihren Django-backend in etwa 10 Zeilen code.
Schließlich die nette Sache über die Verwendung eines IaaS (oder zumindest uns; wieder bin ich nicht sicher über die anderen) ist, dass wir behandeln diese knifflige Skalierung problem für Sie. Wenn Sie den Punkt erreichen, der eine Millionen simultaner Benutzer und schieben müssen Ihnen etwas in real-time, Sie werden finden, dass ist gar kein problem.
Sind wir mit dem real-time push-als auch mit Django und Sellerie. Als ich das erste erstellt die Architektur, die ich auch recherchiert, meine Optionen. Schließlich habe ich mich entschieden, dass ich lieber darauf konzentrieren, wie die app genau das richtige anstatt hantieren mit devops arbeiten. Es gibt verschiedene services da draußen, die bieten gehostet Echtzeit-push-Technologie, die sich problemlos mit jeder app.
Wählte ich PubNub und ich könnte nicht glücklicher sein. Sie unterstützen Buchse.io für die client-Seite und haben eine Python-lib, die ich verwenden von Django und Sellerie Arbeitnehmer. Sie haben auch SDKs, die Sie konnte Verwendung von nativen mobile apps.
Ich weiß, Sie haben bereits ein funktionierendes setup im Ort. Aber ich Wette, dass die Zeit, die es dauern wird, Sie zu ersetzen Ihre aktuellen setup mit so einer gehosteten Lösung wäre weniger als die Zeit, die es dauern wird, Sie eine gute Lösung zu finden für das, was Sie suchen und Sie umzusetzen. Beachten Sie auch Pflege Kosten die Straße hinunter (esp wenn Sie sich für eine lib, die nicht gut gepflegt).
Wahr, Sie zahlen für den service, aber der Preis ist sehr vernünftig, und Sie werden immer ein solider service mit netten Vergünstigungen, wie colocation.
Ich bin in keinerlei Verbindung mit dieser Firma, nur ein zufriedener Kunde. Es gibt ähnliche Dienste gibt.