11

Ich verwende Redis für mein Rails-Projekt, um Kanäle zu abonnieren und in diesen Kanälen zu veröffentlichen, wenn ein Ereignis eintritt. Auf der Client-Seite registriere ich mich bei EventSource, die diesen Kanälen entspricht. Immer wenn ein Ereignis für den abonnierten Kanal auf dem Server auftritt, schreibt der Server eine SSE, so dass alle registrierten Clients das Update erhalten.Server sendet Ereignisse, Puma, Rails und max dedizierte Threads für jeden Client

Jetzt bleibt die Verbindung mit dem Server für jeden Client am Leben, der diese Kanäle abonniert hat, d. H. Server-Thread, der diesem Client zugeordnet ist, läuft weiter, bis der Client die Verbindung trennt. Wenn bei diesem Ansatz 1000 gleichzeitige Benutzer einen Kanal abonniert haben, hätte ich 1000 TCP/IP-Verbindungen geöffnet.

Ich verwende Puma als Webserver wie in this tutorial vorgeschlagen. Puma gibt standardmäßig 16 maximale Threads an. Ich kann dieses Limit auf ein höheres Limit ändern.

Ich weiß vielleicht nicht, wie viele gleichzeitige Benutzer es in meiner App zu einer Zeit sein könnte und weiß nicht, was max. von Threads kann ich in Puma angeben. Wenn im schlimmsten Fall die Anzahl der Threads, die jedem einzelnen Benutzer zugewiesen sind, die maximale Anzahl der für den Puma-Webserver angegebenen Threads erreicht, wird die Anwendung für alle Benutzer angehalten, bis einer der Benutzer die Verbindung getrennt wird.

Ich war aufgeregt zu verwenden Rails Live-Streaming, und Server gesendet Ereignisse in meinem Rails-Projekt, aber mit diesem Ansatz riskiere ich das Limit der maximalen Threads in meinem Web-Server und damit App reagiert für alle Benutzer bis eine von Der gleichzeitige Benutzer trennt die Verbindung.

Nicht sicher, was ist die typische maximale Anzahl von Threads für Puma für eine große Anzahl gleichzeitiger Benutzer.

Sollte ich andere Ansätze in Betracht ziehen - vielleicht ajax-basierte Polling oder Node.js, die ein ereignisgesteuertes, nicht blockierendes I/O-Modell verwendet? Oder einfach ein paar Benchmarks ausführen, um zu wissen, wie hoch meine maximale Anzahl an Threads sein kann?

Antwort

2

Ich arbeite tatsächlich an einem Projekt, bei dem wir wegen der offenen Verbindungsprobleme mit Polling gingen. Wir dachten, dass es einfacher wäre, alle drei Sekunden abzufragen und dann eine Verbindung offen und hängend zu halten. Aber die Anforderungen an die Datenfrische waren nicht sehr streng und betrugen drei Sekunden, also war es machbar und irgendwie dumm, einen Thread für drei Sekunden zu verschwenden.

Also, wenn Sie sehr strenge Anforderungen für Datenfrische und/oder eine eingeschränkte Benutzerbasis und/oder die Fähigkeit, eine Menge von Threads haben, haben, ist regelmäßige Polling normalerweise der Weg zu gehen.

Und auf der anderen Seite, wenn sie ständig Ihren Server treffen, und es würde länger dauern, um die Daten erneut abzufragen, dann Ihre Datenfrische Anforderung, können Sie genauso gut die Verbindung offen halten, um zu vermeiden der ganze Stapel wieder.

Auch in Puma 2 können Sie es auch im Cluster-Modus ausführen, was bedeutet, dass es zusätzliche Arbeiter mit eigenen Threads erzeugt und Sie können mit Workers X Threads = Total Threads enden. Das könnte bei Ihren Berechnungen helfen.

https://github.com/puma/puma#clustered-mode