Ich erstelle eine Echtzeit-Webanwendung Soweit ich weiß, sind Short-Polling und Long-Polling die beliebtesten Optionen. Welche Vor- und Nachteile kann es geben, wenn man übereinander misst?
Ich erstelle eine Echtzeit-Webanwendung Soweit ich weiß, sind Short-Polling und Long-Polling die beliebtesten Optionen. Welche Vor- und Nachteile kann es geben, wenn man übereinander misst?
Antworten:
Kurzes Polling (auch bekannt als AJAX-basierter Timer):
Vorteile: einfacher, nicht serveraufwendig (wenn die Zeit zwischen den Anforderungen lang ist).
Nachteile: schlecht, wenn Sie benachrichtigt werden müssen, wenn das Serverereignis ohne Verzögerung auftritt.
Beispiel ( ItsNat basiert)
Lange Umfragen (auch bekannt als Comet basierend auf XHR)
Vorteile: Sie werden benachrichtigt, wenn das Serverereignis ohne Verzögerung auftritt. Nachteile: komplexere und mehr verwendete Serverressourcen. Beispiel (ItsNat basiert)
Nur aus Gründen der Argumentation.
Beide sind http-Anfragen (xhr), und es ist zumindest teilweise falsch, dass mehr Serverressourcen verwendet werden (hängt vollständig von der Technologie ab, wird später erklärt).
Viele Anfragen, die verarbeitet werden, wenn sie auf den Server kommen. Erzeugt viel Verkehr (verwendet Ressourcen, gibt sie jedoch frei, sobald die Antwort zurückgesendet wird):
00:00:00 C-> Is the cake ready?
00:00:01 S-> No, wait.
00:00:01 C-> Is the cake ready?
00:00:02 S-> No, wait.
00:00:02 C-> Is the cake ready?
00:00:03 S-> Yes. Have some lad.
00:00:03 C-> Is the other cake ready? ..
Eine Anfrage geht an den Server und der Client wartet auf die Antwort (ungelöst). Im Falle eines Servers mit PHP / Apache würde dies bedeuten, dass ein erzeugter Thread behandelt wird, der Ressourcen reserviert, bis er fertig ist. Der Datenverkehr ist also geringer, aber Sie verbrauchen Ihre Ressourcen schnell (oder blockieren Ressourcen). Wenn Sie jedoch beispielsweise Node (oder einen anderen asynchronen Ansatz - z. B. c ++ qt) verwenden, können Sie möglicherweise die Ressourcennutzung erheblich minimieren (Antwortobjekt für http-Anforderung speichern und verwenden, wenn die Arbeit fertig ist).
12:00 00:00:00 C-> Is the cake ready?
12:00 00:00:03 S-> Yes.Have some lad.
12:00 00:00:03 C-> Is the cake ready?
Wenn Sie dies mit einer kurzen Abfrage vergleichen, werden Sie feststellen, dass Sie möglicherweise in einer kurzen Abfrage mehr Übertragung verwendet haben, aber während dieser 3 Sekunden benötigen Sie tatsächlich 1,5 Sekunden Verarbeitungszeit (was bedeutet, dass zwischen Ihren Anrufen etwas ausgeführt werden könnte). Für lange Abstimmungen wurden immer die gleichen Ressourcen verwendet. Normalerweise beginnt PHP mit allen Bibliotheken mit 4 MB Speicher - dann haben Sie ein Framework von 4 bis 20 MB. Angenommen, Sie haben 1024 MB RAM zur Verfügung (kostenlos). Nehmen wir an, wir sind pessimistisch und gehen davon aus, dass Sie 25 MB pro PHP-Instace verwenden. Dies bedeutet, dass Sie nur bis zu 40 lange abgefragte Verbindungsskripte erhalten können.
Dies ist genau der Grund, warum Sie mit Node möglicherweise viel mehr Dienste leisten können, da der Knoten seine Instanzen nicht erzeugt (es sei denn, Sie möchten Worker usw. verwenden), sodass Sie mit demselben Speicher wahrscheinlich problemlos zu 10.000 hängenden Verbindungen gelangen können. Sie würden eine Spitze in der CPU bekommen, wenn sie kommen und wenn sie möglicherweise freigegeben werden, aber wenn sie im Leerlauf sind, ist es so, als wären sie nicht da (Sie zahlen nur für die Speicherstrukturen, die Sie in Node / C ++ behalten würden).
Wenn Sie nun einige Dinge senden möchten, wann immer sie sich im oder außerhalb des Clients befinden, wählen Sie die Websockets (ws-Protokoll). Der erste Aufruf entspricht der Größe der http-Anforderung. Später senden Sie jedoch nur die Nachrichten von Client zu Server (neue Fragen) und von Server zu Client (Antworten oder Pushs - können sogar Broadcasts für alle verbundenen Clients ausführen). Es gibt PHP-Websocekts-Bibliotheken, aber verwenden Sie auch hier eine andere Technologie - vorzugsweise Node oder C ++.
Einige Bibliotheken, wie z. B. socket.io, haben eine eigene Hierarchie. Wenn das Websocket ausfällt, wird auf lange oder kurze Abfragen zurückgegriffen.
Kurze Umfrage - na ja, niemals ^^.
Lange Abfrage - möglicherweise, wenn Sie einen einzelnen Anruf mit dem Server austauschen und der Server im Hintergrund arbeitet. Auch wenn Sie den Server nicht mehr auf derselben Seite abfragen. Auch wenn Sie PHP nicht als Layer verwenden, um die lange abgefragte Verbindung zu handhaben (Node / C ++ kann eine einfache mittlere Layer sein). Beachten Sie, dass lange Abfragen sehr nützlich sein können, aber nur, wenn Sie es so machen.
Websocket - Möglicherweise tauschen Sie mehr als ein oder zwei Anrufe mit dem Server aus, oder es kommt etwas von einem Server, den Sie nicht erwartet / gefragt haben, z. B. eine Benachrichtigung über E-Mails oder ähnliches. Sie sollten verschiedene "Räume" planen, abhängig von den Funktionen. Umfassen Sie die ereignisbasierte Natur von Javascript;]
Wenn Sie eine Echtzeitanwendung basierend auf einer Datenbank erhalten möchten, können Sie eine Kombination aus Ajax Long Poll und Comet verwenden. Lange Umfragen sind sehr gut für Ihre Bandbreite und auch sehr nützlich für Benutzer-MB. Denn wenn Benutzer eine Anfrage senden, zahlt der Benutzer dafür wie MB oder eine Art Internetverbindung. Zum Beispiel für kurze Umfragen, wenn Sie so etwas wie eine Anfrage per senden Die Internetnutzung des zweiten Benutzers ist höher, da jeder Verbindungsbenutzer dafür bezahlt (dies bedeutet, dass der Benutzer Mb verliert), aber in der langen Abfrage zahlt der Benutzer nur für neue Nachrichten.
Websocket ist wirklich eine gute Sache, aber wenn Sie es verwenden, sollten Sie über ein großes Problem nachdenken, dass viele Leute das Chat-System nicht verwenden können, da Websocket nur für eine neue Version von Browsern gedacht ist