Frage

Implementieren Sie einen server mit Unterstützung für clients mit web sockets, do-Servern halten eine offene HTTP-Verbindung mit jedem client?Wie kann dieser Waage?

Was sind die "Programmier-Modelle" bei der Umsetzung dieser Art von server?Ie:die meisten web-apps haben, servlets, etc., die Unterstützung eines connect->request->response->schließen-type-Modell.In der Erwägung, dass mit web-sockets, der die Verbindung geöffnet bleibt auf unbestimmte Zeit.

War es hilfreich?

Lösung

Sie müssen in der Regel arbeiten in einer asynchrone Vorbild für diese langlebige verbindungen zu arbeiten.Es gibt verschiedene Techniken, die das tun, asynchrone I/O;alle haben Ihre vor-und Nachteile.

Man sollte bereits jedem bekannt sein, die hat arbeitete mit JavaScript und AJAX ist die callback-Modell;in dem Sie eine Anfrage schicken, und installieren Sie einen Rückruf aufgerufen wird, wenn es abgeschlossen ist.Dies ist, wie XMLHTTPRequest arbeitet, ohne zu blockieren alle anderen Seiten während Sie warten, bis eine Seite das verlangen zu beenden.Dies ist auch, wie die Twisted Python-networking-framework funktioniert, aber es können Methoden aufrufen, die auf Objekte oder callback-Funktionen, die je nach Schnittstellen, die Sie verwenden.

Ein weiteres leistungsstarkes Modell ist der Erlang Stil Ansatz, rief der Schauspieler, Modell, hat, viele, viele leichtgewichtige Prozesse (wie threads, aber keinen gemeinsamen Staat), von denen jeder mit jedem anderen kommunizieren über asynchrone Nachrichten.Die Erlang-Laufzeit implementiert wurde, um das laichen Tausende von Prozessen sehr effiziente;dann können Sie nur einen Prozess für jede Verbindung, und Sie senden von Nachrichten an andere Prozesse der Implementierung der backend Ihrer Anwendung.Erlang-Prozesse kann auch automatisch zeitgesteuert auf mehreren OS-threads, die zu nehmen volle Vorteil von multi-core-Systemen. ejabberd, ein beliebter Jabber-server (einem chat-Protokoll, das erfordert viele lange-lebte offenen verbindungen), ist in Erlang implementiert, so ist die Facebook-Chat-system.

Die neue Go Sprache die von Google verwendet einen ähnlichen Ansatz, näher zu den Hoare ' s Communicating Sequential als Erlang die Schauspieler-Modell, aber die hat eine Menge von ähnlichkeiten.

In Mac OS X 10.6 stellte Apple Grand Central Dispatch, zusammen mit Blöcken (im wesentlichen Verschlüsse) in C, C++ und Objective-C.Dies ermöglicht es so etwas wie die AJAX-oder Twisted-style event driven callback-Modell, aber mit explizit verwalteten Warteschlangen, die nacheinander ausgeführt werden, um verwalten des Zugriffs auf freigegebene Ressourcen in Multithreading, multi-core-Umgebung.Verdreht und JavaScript laufen beide single-threaded ist, und so kann nur die Vorteile eines single-core, es sei denn, Sie verwenden mehrere Betriebssystem-Prozesse, die relativ schwere Gewicht und erhöhen die Kosten der Kommunikation zwischen Ihnen.

Und dann gibt es die traditionellen Modelle, wie der Unix select Funktion, oder den modernen und fähig epoll oder kqueue().In diesen, haben Sie in der Regel einen Haupt-Schleife in deinem Programm, das festlegt, eine Reihe von Veranstaltungen, um für die Uhr (Netzwerk-I/O gibt einige weitere Daten, Datei-I/O gibt mehr Daten, eine neue Netzwerk-Verbindung hergestellt ist, etc), und ruft dann einen system-Aufruf blockiert, bis eines dieser Ereignisse aufgetreten ist, an welchem Punkt Sie prüfen, welche eingetreten ist und dann entsprechend behandeln.Diese Systemaufrufe sind in der Regel verwendet, um die höheren level-frameworks, wie oben beschrieben.

Für eine sehr gute übersicht über die beeindruckende Reihe von Optionen zur Verfügung (mit Schwerpunkt auf den eher traditionellen und unteren Ebene, Unix-Ansätze), siehe Das C10K-Problem, eine Umfrage von verschiedenen Techniken für helfen zu deal mit 10.000 gleichzeitige verbindungen auf einmal.Das hat auch eine gute Liste von C-und C++ - Bibliotheken, die für die Abstraktion, die über die verschiedenen APIs zur Verfügung, wie libevent.

Eine Letzte option, natürlich, ist zu einem Prozess oder einem OS-thread für jede Verbindung.Das problem ist, Prozesse sind sehr schwere Gewicht, und sogar Fäden sind ziemlich schweres Gewicht im Vergleich zu viele dieser Optionen.Im Allgemeinen, für die beste Leistung, die Sie würde wollen ein Prozess oder thread pro CPU, die jeweils mit einer asynchronen I/O-API herausfinden, wenn es Sie braucht, um Arbeit zu tun, und dann dispatching, dass die Arbeit zu einer von mehreren Objekten oder Rückrufe, die registriert wurden, um Griff-verbindungen, oder eine von mehreren Erlang-Stil lightweight-Prozesse, die darauf wartet, dass eine Nachricht, oder so etwas in der Art.

Als eine Seite beachten, wird die Verbindung in web-sockets nicht-HTTP-verbindungen, aber ein neues Protokoll, das websocket protocol, obwohl Sie den gleichen port wie HTTP, und aktualisieren Sie eine HTTP-Verbindung zu einem web-socket, um kompatibel mit bestehenden firewall-Regeln.

Andere Tipps

Im Allgemeinen können Sie erwarten, zu verwenden WebSockets mit benutzerdefinierten server-Implementierungen entwickelt, um die Last zu bewältigen, die in einer leichten Art und Weise.Solche Server gibt es bereits für langlebige KOMETEN verbindungen und dergleichen.

es unterscheidet sich von http in, dass jede nachfolgende Anforderung / Antwort muss nicht gewickelt werden in eine http-Nachricht mit http-Headern.so real-time apps bräuchten nicht den overhead der Header parsing.nach der ersten http-wie handshake, es ist im Grunde verhält sich wie ein normales ol' tcp-socket.

dies könnte modelliert mit servlets, aber man muss nur unterscheiden zwischen dem ursprünglichen Antrag (mit allen Headern) und das anschließende, 2-Wege-dialog, dessen format ist beliebig, für die meisten Teil.

Werfen Sie einen Blick auf HTML 5 WebSockets implementiert Tornado-webserver:http://bret.appspot.com/entry/web-sockets-in-tornado

Ich habe nicht gespielt, mit diesem Modul allerdings noch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top