suche - w3schools php rss




Skalierung einer Chat-App-Kurzes Polling vs. langes Polling(AJAX, PHP) (2)

Dies ist etwas, was jeder einmal vor der Einführung von cometd und nodejs getan hat.

Das Problem, wie ich es sehe, ist PHP-Anfragen auf Apache sind sehr teuer. Wenn Ihre Chat-Anwendung jede Sekunde nach Nachrichten sucht, befinden Sie sich in einer Situation, in der Apache nicht genügend Ressourcen hat, um auf Anfragen zu antworten. Der andere Bereich, der meiner Meinung nach verbesserungsbedürftig ist, besteht darin, den Kontext Ihrer Chat-Anwendung zu verbessern.

Warum wird jede Sekunde aktualisiert, wenn keine neuen Nachrichten abgerufen werden sollen? Was ist, wenn es keine Nachrichten gibt?

Einige Techniken, die Sie verwenden können;

  • Geben Sie Ihren Clients einen leichten Endpunkt mit einigen Kontexten über die Chat-Sitzung, ist eine neue Nachricht ausstehend, wie viele Nachrichten usw. Der Client kann darauf reagieren, indem er sofort aktualisiert oder nicht, wenn keine neuen Nachrichten vorhanden sind. Dieser Endpunkt kann ein einfaches JSON-Objekt über eine HTTP-Anfrage bereitstellen. Sie haben garantiert, dass diese Statusmeldung eine feste Größe hat und wenn sich die Antwort des Status nicht ändert, können Sie sie verwerfen. Siehe nächste Nachricht.

  • Ein einfacher Verfall in Ihrer Javascript-Abfrage, wenn der Client die gleiche Antwort vom Server ein paar Mal in Folge erhält, können Sie die Umfrage um eine bestimmte Zeit erhöhen, derzeit sagten Sie, es sei jede Sekunde. Wenn Sie dies tun würden, würden Sie alle 2,4,6,8,10 Sekunden erhöhen. Sobald sich die Antwort vom Server ändert, setzen Sie den Verfall zurück.

Einige zu berücksichtigende Optimierungen;

  • Verwenden Sie einen PHP-Opcode-Cache wie APC.

  • Legen Sie für alle Anforderungen eine niedrige Zeitüberschreitung fest. Sie möchten nicht, dass Anforderungen Ihren Server aufhängen.

  • Optimieren Sie Ihren PHP-Code, machen Sie ihn schlank und schnell.

  • Führen Sie einige Belastungstests durch, um zu sehen, wo Ihre Grenzen liegen.

  • Benchmark-Leistung oft, um sicherzustellen, dass Ihre Anwendungen schneller werden.

  • Überprüfen Sie die Apache-Protokolle auf Anzeichen für den allgemeinen Zustand der Anwendung und die Antwortzeiten.

Wenn die Skalierung erforderlich wird, fügen Sie einen neuen Server hinzu und verwenden Sie einen Lastenausgleich, um Anforderungen zu verteilen. Ich habe Varnish und HAProxy mit großem Erfolg eingesetzt, die Einrichtung ist auch nicht kompliziert.

Ich betreibe eine Website, auf der Nutzer über den Browser miteinander chatten können (denke Facebook Chat). Was ist der beste Weg, um die Live-Interaktion zu bewältigen? (Im Moment habe ich alle 30 Sekunden eine Umfrage, um Online-Benutzer und neue eingehende Nachrichten zu aktualisieren, und eine weitere Umfrage geht jede Sekunde auf Chat-Seiten, um neue Nachrichten zu erhalten.)

Dinge, die ich in Betracht gezogen habe:

  • HTML5 Web Sockets: Benutzte dies nicht, da es nicht in allen Browsern funktioniert (nur Chrome).
  • Flash Sockets: Habe das nicht genutzt, weil ich irgendwann das mobile Web unterstützen wollte.

Im Moment benutze ich kurze Abfragen, weil ich nicht weiß, wie skalierbar AJAX Long Polling sein würde. Ich betreibe gerade einen VPS-Server von Servint (laufender Apache). Soll ich lange Polling oder kurze Polling verwenden? Ich brauche keine absolut schnellen Antwortzeiten (nur "gut genug" für eine Chat-App). Ist das kurzes Polling das oft mit ein paar hunderttausend Usern die meinen Server umbringen? Wie skaliere ich das, bitte helfen Sie!


Ein paar Anmerkungen:

  • Polling jede Sekunde ist Overkill. Die App wird immer noch sehr schnell reagieren mit ein paar Sekunden Verzögerung zwischen den Überprüfungen.
  • Zum Speichern der Datenverkehrs- und Geschwindigkeitsantworten Ihrer Datenbank sollten Sie einen Zwischenspeicher verwenden, um nicht zugestellte Nachrichten zu speichern. Sie könnten weiterhin Nachrichten an die db persistieren, der in-memory-cache würde einfach für Abfragen nach neuen Nachrichten verwendet werden, um Abfragen an die db alle x Sekunden durch jeden Benutzer zu vermeiden.
  • Timeout des Chat des Benutzers nach x Sekunden Inaktivität, um die Abfrage auf dem Server zu beenden. Dies stellt sicher, dass jemand, der ein Fenster verlässt, nicht weiterhin Datenverkehr generiert. Bieten Sie ein einfaches "Immer noch? Weiter Chat." Link für Sitzungen, die Timeout und warnen den Benutzer vor dem Timeout, so dass sie das Timeout verlängern können.
  • Ich würde vorschlagen, mit Umfragen zu beginnen und nicht mit Kometen / langen Umfragen / Steckdosen. Polling ist einfach zu erstellen und zu unterstützen und wird wahrscheinlich kurzfristig gut skalieren. Wenn Sie viel Verkehr bekommen, können Sie Hardware und einen Load-Balancer auf das Problem skalieren. Das gesamte Web basiert auf Polling - Polling sicherlich Skalen. Es gibt einen Punkt, an dem die Komplexität von Alternativen wie Comet / Long-Polling / usw. sinnvoll ist, aber Sie brauchen viel Traffic, bevor die zusätzliche Entwicklungszeit / Komplexität gerechtfertigt ist.




sockets