Dies ist etwas, das jeder einmal getan hat, bevor die Einführung von Cometd und Nodejs erfolgte.
Das Problem, wie ich es sehe, ist, dass PHP-Anfragen auf Apache sehr teuer sind. Wenn Ihre Chat-Anwendung alle Sekunde nach Nachrichten sucht, werden Sie sich in einer Situation wiederfinden, in der Apache nicht genügend Ressourcen hat, um auf Anfragen zu antworten. Der andere Bereich, in dem ich Verbesserungen sehe, ist die Verbesserung des Kontexts Ihrer Chat-Anwendung.
Warum wird es alle Sekunde aktualisiert, wenn nicht, um neue Nachrichten abzurufen? Was ist, wenn es keine Nachrichten gibt?
Einige Techniken, die Sie verwenden können;
-
Bieten Sie Ihren Clients einen leichten Endpunkt an, der einige Informationen über die Chat-Sitzung enthält, ob eine neue Nachricht aussteht, wie viele Nachrichten usw. Der Client kann darauf reagieren, indem er sofort aktualisiert oder nicht, wenn es keine neuen Nachrichten gibt. Über diesen Endpunkt kann ein einfaches JSON-Objekt über einen HTTP-Request bereitgestellt werden. Sie können sicher sein, dass diese Statusnachricht eine feste Größe hat und wenn sich die Antwort des Status nicht ändert, können Sie sie abbauen. Siehe nächste Nachricht.
-
Ein einfaches Absinken in Ihrem Javascript-Polling, wenn der Client einige Male hintereinander dieselbe Antwort vom Server erhält, können Sie das Polling um eine bestimmte Zeit erhöhen, derzeit sagten Sie, es sei jede Sekunde. Wenn Sie dies tun würden, würden Sie auf jede 2., 4., 6., 8., 10. Sekunde erhöhen. Sobald sich die Antwort vom Server ändert, setzen Sie das Absinken zurück.
Einige Optimierungen zum Überlegen;
-
Verwenden Sie einen PHP-Opcode-Cache wie APC.
-
Legen Sie ein niedriges Timeout für alle Anfragen fest, damit keine Anfragen Ihren Server blockieren.
-
Optimieren Sie Ihren PHP-Code, machen Sie ihn schlank und schnell.
-
Führen Sie einige Lasttests durch, um herauszufinden, wo Ihre Grenzen liegen.
-
Führen Sie häufig Benchmarks durch, um sicherzustellen, dass Ihre Anwendungen schneller werden.
-
Überprüfen Sie die Apache-Protokolle auf Anzeichen für den Gesundheitszustand der Anwendung und die Reaktionszeiten.
Wenn das Skalieren notwendig wird, fügen Sie einen neuen Server hinzu und verwenden Sie einen Lastausgleicher, um Anfragen zu verteilen. Ich habe Varnish und HAProxy mit großem Erfolg verwendet, und auch ihre Einrichtung ist nicht kompliziert.
1 Stimmen
Ich weiß, dass Apache im Allgemeinen nicht gut mit vielen gleichzeitigen Verbindungen umgeht. Und ich bin mir auch bewusst, dass es möglicherweise andere Lösungen für dieses Szenario gibt (nodejs, usw.). Aber im Moment möchte ich vermeiden, die gesamte Anwendung neu zu schreiben.
0 Stimmen
Was ist mit der Implementierung mehrerer Lösungen für verschiedene Plattformen? D.h. wenn HTML5 unterstützt wird, verwendet der Browser HTML5, wenn Flash unterstützt wird, verwendet der Browser Flash, wenn keiner der beiden unterstützt wird, verwendet der Browser AJAX.
0 Stimmen
Sie könnten an diesem Beitrag interessiert sein urbanairship.com/blog/2010/09/29/linux-kernel-tuning-for-c500k