Frage

Will Web Sockets, wenn in allen Web-Browsern verwendet machen Ajax veraltet?

Ursache, wenn sie Web-Sockets verwenden könnte Daten und Aktualisierung von Daten in Echtzeit zu holen, warum sollte ich ajax braucht? Auch wenn ich Ajax verwenden, um nur Daten abrufen, wenn beim Start der Anwendung noch könnte ich mag sehen, ob diese Daten nach einer gewissen Zeit verändert haben.

Und werden Web-Sockets möglich sein, in Quer Domänen oder nur auf den gleichen Ursprung?

War es hilfreich?

Lösung

WebSockets nicht machen AJAX völlig veraltet und WebSockets können Cross-Domain tun.

AJAX

AJAX Mechanismen können mit einfachen Web-Server verwendet werden. Auf der elementarsten Ebene ist AJAX nur eine Möglichkeit für eine Web-Seite eine HTTP-Anforderung zu machen. WebSockets ist ein viel niedrigeres Niveau Protokoll und erfordert einen WebSockets-Server (entweder in die Webserver, allein gebaut, oder vom Webserver zu einem eigenständigen Server als Proxy).

Mit WebSockets, die Gestaltung und Nutzlast wird durch die Anwendung bestimmt. Sie könnten HTML / XML / JSON hin und her zwischen Client und Server senden, aber Sie nicht dazu gezwungen werden. AJAX ist HTTP . WebSockets hat einen HTTP-freundlichen Händedruck, aber WebSockets ist nicht HTTP . WebSockets ist ein bidirektionales Protokoll, das näher an Raw Sockets ist (absichtlich so), als es zu HTTP ist. Die WebSockets Nutzdaten ist UTF-8 in der aktuellen Version des Standards verschlüsselt, aber das ist wahrscheinlich in zukünftigen Versionen geändert / erweitert werden.

So wird es wahrscheinlich immer ein Ort für AJAX-Typ-Anforderungen auch in einer Welt, in der alle Kunden WebSockets nativ unterstützen. WebSockets versucht, Situationen zu lösen, wo AJAX nicht in der Lage oder geringfügig fähig ist (weil WebSockets seine bidirektionale und viel Aufwand senken). Aber WebSockets nicht alles AJAX ersetzen wird verwendet für.

Cross-Domain

Ja , WebSockets unterstützt Cross-Domain. Der anfängliche Handshake zum Einrichten der Verbindung kommuniziert origin policy Informationen. Die Wikipedia-Seite zeigt ein Beispiel eines typischen Handshake: http://en.wikipedia.org/wiki/WebSockets

Andere Tipps

Ich werde versuchen, diese nach unten in Fragen zu brechen:

  

Will Web Sockets, wenn in allen Web-Browsern verwendet machen Ajax veraltet?

Absolut nicht. WebSockets sind Raw-Socket-Verbindungen zum Server. Dieses kommt mit seine eigene Sicherheitsbedenken . AJAX Anrufe sind einfach async. HTTP-Anforderungen, die die gleichen Validierungsverfahren wie der Rest der Seiten folgen kann.

  

Ursache, wenn sie Web-Sockets verwenden könnte Daten und Aktualisierung von Daten in Echtzeit zu holen, warum sollte ich ajax braucht?

Sie würden AJAX verwenden für einfachere überschaubare Aufgaben. Nicht jeder will den Aufwand für die Sicherung eine Socket-Verbindung haben, um einfach Asynchron-Anfragen zu ermöglichen. Das kann einfach genug behandelt werden.

  

Auch wenn ich Ajax verwenden, um nur Daten einmal zu holen, wenn die Anwendung gestartet ich noch wünschen kann, um zu sehen, ob diese Daten nach einer gewissen Zeit verändert haben.

Sicher, , wenn diese Daten verändern . Sie können nicht haben die Daten zu ändern oder ständig zu aktualisieren. Auch dies ist Code-Overhead , dass Sie zu Konto.

  

Und werden Web-Sockets möglich sein, in Quer Domänen oder nur auf den gleichen Ursprung?

Sie können die Cross-Domain-WebSockets haben, aber Sie haben Ihren WS-Server zu kodieren, sie zu akzeptieren. Sie haben Zugriff auf die Domäne (Host) Header, die Sie dann akzeptieren verwenden können, um / verweigern Anfragen. Dies kann jedoch durch etwas so Einfaches wie nc Spoofing. Um wirklich die Verbindung zu sichern, müssen Sie die Verbindung mit anderen Mitteln authentifizieren.

Websockets haben ein paar große Nachteile in Bezug auf Skalierbarkeit, dass Ajax vermeidet. Da Ajax sendet eine Anforderung / Antwort und schließt die Verbindung (..oder kurz nach), wenn jemand Aufenthalten auf der Webseite nicht Server-Ressourcen nicht verwenden, wenn im Leerlauf. Websockets werden Stream-Daten an den Browser zurück gemeint, und sie Server-Ressourcen, dies zu tun binden. Server haben ein Limit, wie viele gleichzeitige Verbindungen sie können gleichzeitig offen halten. Nicht zu erwähnen, auf dem Server-Side-Technologie abhängig, können sie einen Thread zu handhaben die Buchse binden. So haben WebSockets ressourcenintensive Anforderungen für beide Seiten pro Verbindung. Sie könnten leicht alle Ihre Themen erschöpfen Kunden Wartung und dann keine neuen Kunden in könnte kommen, wenn viele Benutzer auf der Seite nur sitzen. Dies ist, wo NodeJS, VertX, netty wirklich helfen kann, aber auch diejenigen, haben Obergrenzen als auch.

Auch gibt es die Frage des Zustandes des zugrunde liegenden Socket und das Schreiben den Codes auf beiden Seiten, die auf dem Stateful-Gespräch zu führen, die nicht etwas, das Sie haben mit Ajax-Stil zu tun, weil es der staatenlos. Websockets benötigen Sie ein Protokoll auf niedriger Ebene erstellen, die für Sie mit Ajax gelöst. Dinge wie Herzschlag, Leerlaufverbindungen zu schließen, Wiederverbindung auf Fehler, etc. sind jetzt von entscheidenden Bedeutung. Dies sind Dinge, die Sie nicht zu lösen, wenn AJAX verwenden, weil sie staatenlos war. Zustand ist sehr wichtig für die Stabilität Ihrer App und was noch wichtiger ist die Gesundheit Ihres Servers. Es ist nicht trivial. Pre-HTTP wir viele Stateful TCP-Protokolle gebaut (FTP, Telnet, SSH) und dann HTTP passiert ist. Und niemand hat das Zeug viel mehr, weil auch mit seinen Grenzen HTTP wurde überraschend einfacher und robuster. Websockets bringen die guten und die schlechten von Stateful-Protokolle zurück. Sie werden bald genug lernen, wenn Sie nicht eine Dosis von diesem letzten Sprung bekommen haben um.

Wenn Sie das Streaming von Echtzeit-Daten dieser zusätzliche Aufwand gerechtfertigt ist, weil Abfrage der Server gestreamten Daten zu bekommen, ist schlimmer, aber wenn alles, was Sie tun, ist Interaktions- user> request-> response-> Update UI, dann Ajax ist einfacher und wird weniger Ressourcen verwenden, denn wenn die Antwort gesendet wird, das Gespräch vorbei ist und keine zusätzlichen Server-Ressourcen verwendet werden. Also ich denke, es ist ein Kompromiss und der Architekt muss entscheiden, welches Werkzeug ihr Problem paßt. AJAX hat seinen Platz, und WebSockets haben ihren Platz.

Aktualisieren

So ist die Architektur des Servers ist, worauf es ankommt, wenn wir über Themen sprechen. Wenn Sie werden traditionell mit einem Multi-Threaded-Server (oder Prozesse), wo ein jeder Socket-Verbindung auf Anfragen einen eigenen Thread zu reagieren wird dann WebSockets viel für Sie. Also für jede Verbindung haben wir eine Steckdose, und schließlich wird das O umfallen, wenn Sie zu viele von ihnen, und das gleiche gilt für die Fäden (um so mehr für Prozesse). Themen sind schwerer als Buchsen (in Bezug auf Ressourcen), so dass wir versuchen und zu erhalten, wie viele Threads wir gleichzeitig laufen haben. Das bedeutet einen Thread-Pool zu schaffen, das nur eine feste Anzahl von Fäden ist, die unter allen Buchsen gemeinsam genutzt wird. Aber sobald ein Socket geöffnet wird, wird der Faden für die gesamte Konversation verwendet. Die Länge dieser Gespräche bestimmen, wie schnell Sie diese Themen für neue Steckdosen umfunktionieren können kommen in. Die Länge des Gesprächs bestimmt, wie viel Sie skaliert werden kann. Allerdings, wenn Sie dieses Modell sind Streaming nicht gut für die Skalierung funktioniert. Sie haben den Faden / Socket-Design zu brechen.

HTTP Anforderung / Antwort-Modell macht es sehr effizient in Threads für neue Steckdosen Umdrehen. Wenn Sie vorhaben, nur um den Einsatz Request / Response Verwendung HTTP sein bereits gebaut und viel einfacher als in WebSockets so etwas Neuimplementierung.

Da WebSockets muß nicht Request / Response als HTTP und kann Daten streamen, wenn der Server eine feste Anzahl von Threads in seinem Threadpool hat, und Sie haben die gleiche Anzahl von WebSockets talle Ihre Themen mit aktiven Gespräche ying, können Sie keine neuen Kunden in den kommenden instandzuhalten! Sie haben Ihre maximale Kapazität erreicht. Das ist, wo Protokolldesign auch wichtig mit WebSockets und Gewinde ist. Ihr Protokoll könnte Ihnen ermöglichen, den Faden pro Socket pro Gespräch Modell lösen auf diese Weise die Menschen dort einfach sitzen nicht einen Thread auf dem Server verwenden.

Das ist, wo asynchroner einzelner Thread-Server kommt in. In Java nennen wir oft diese NIO für non-blocking IO. Das heißt es ist eine andere API für Steckdosen, wo das Senden und Empfangen von Daten blockieren nicht den Faden um den Anruf durchführt.

So traditionelle Steckdosen in blockieren, wenn Sie socket.read () aufrufen oder socket.write () sie warten, bis die Daten empfangen oder gesendet, bevor die Steuerung an Ihr Programm zurückkehrt. Das heißt, Ihr Programm stecken Warten auf die Buchse Daten kommen oder gehen, bis Sie etwas anderes tun kann. Deshalb haben wir Threads so arbeiten wir gleichzeitig tun können (zur gleichen Zeit). Senden Sie diese Daten an den Client X, während ich auf Daten vom Client warten Y. Nebenläufigkeiten der Name des Spiels ist es, wenn wir über Server sprechen.

In einem NIO-Server verwenden wir einen einzigen Thread alle Kunden zu handhaben und registrieren Rückrufe benachrichtigt werden, wenn Daten ankommen. Zum Beispiel

socket.read( function( data ) {
   // data is here! Now you can process it very quickly without waiting!
});

Die socket.read () Anruf wird sofort zurück, ohne Daten zu lesen, aber unsere Funktion zur Verfügung gestellt werden wir aufgerufen werden, wenn es kommt. Dieser Entwurf radikal verändert, wie Sie bauen und Architekt Code, denn wenn Sie hängte aufstehen warten auf etwas, das Sie können keine neuen Kunden erhalten. Sie haben einen einzigen Thread kann man nicht wirklich zwei Dinge auf einmal tun! Man muss sich immer, dass ein Thread zu bewegen.

NIO, Asynchronous IO, Event-basierendes Programm, wie dies alles wie bekannt ist, ist ein viel komplizierteres System-Design, und ich würde nicht vorschlagen, versuchen, dies zu schreiben, wenn Sie beginnen. Selbst sehr alter Programmierer findet es sehr schwer, ein robusten Systeme zu bauen. Da Sie asynchron sind, können Sie rufen nicht APIs, dass Block. Wie Daten aus der DB zu lesen oder das Senden von Nachrichten an andere Server haben asynchron ausgeführt werden. Auch das Lesen / Schreiben aus dem Dateisystem kann nach unten senken Ihre Skalierbarkeit Ihren einzigen Thread verlangsamen. Sobald Sie asynchrone gehen es ist alles asynchron die ganze Zeit, wenn Sie die einzelnen Thread in Bewegung halten wollen. Das ist, wo es wird schwierig, weil Sie schließlich in eine API ausgeführt werden, wie DBs, die nicht asynchron ist, und Sie müssen mehr Threads auf einer gewissen Ebene erlassen. So ein Hybrid-Ansätze sind häufig auch in der asynchronen Welt.

Die gute Nachricht ist, gibt es andere Lösungen, die diesen niedrigeren Level-API verwenden bereits gebaut, dass Sie verwenden können. NodeJS, Vertx, Netty, Apache Mina, Spielen Framework Twisted-Python, Stackless Python, etc. Es könnte einige obskure Bibliothek für C ++, aber ehrlich gesagt würde ich nicht stören. Server-Technologie erfordert nicht die sehr schnellsten Sprachen, weil es IO mehr als CPU gebunden gebunden. Wenn Sie eine Chip Verwendung harte Leistung Mutter Java. Es hat eine große Gemeinschaft von Code zu ziehen aus und es ist die Schnelligkeit ganz in der Nähe (und manchmal besser) als C ++. Wenn Sie nur hasse es, gehen mit Knoten oder Python.

Ja, ja es tut. : D

Die früheren Antworten fehlen Phantasie. Ich sehe keinen Grund mehr, AJAX zu verwenden, wenn WebSockets Ihnen zur Verfügung stehen.

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