11

Używam projektu Redis do realizacji moich railsów, aby subskrybować kanały i publikować je w tych kanałach, gdy wystąpi zdarzenie. Po stronie klienta rejestruję się w EventSource, który odpowiada tym kanałom. Gdy wystąpi zdarzenie dla subskrybowanego kanału na serwerze, serwer wykonuje zapis SSE, aby wszyscy zarejestrowani klienci otrzymali aktualizację.Zdarzenia wysyłane przez serwer, Puma, szyny i maksymalne dedykowane wątki dla każdego klienta

Teraz połączenie z serwerem pozostaje aktywne dla każdego klienta, który subskrybuje te kanały, tj. Wątek serwera dedykowany dla tego klienta działa, dopóki klient się nie rozłączy. Dzięki takiemu podejściu, jeśli istnieje 1000 równoczesnych użytkowników subskrybujących kanał, będę miał otwarte 1000 połączeń TCP/IP.

Używam Puma jako serwera WWW zgodnie z sugestią w this tutorial. Puma domyślnie określa 16 maksymalnych wątków. Mogę zmienić ten limit na wyższy limit.

Mogę nie wiedzieć, ilu jednoczesnych użytkowników może znajdować się jednocześnie w mojej aplikacji i nie wiem, co to jest maksymalna liczba. wątków, które mogę określić w Puma. W najgorszym przypadku, jeśli liczba wątków dedykowanych każdemu równoczesnemu użytkownikowi osiągnie maksymalną liczbę wątków określonych dla serwera WWW Puma, aplikacja zawiesi się dla wszystkich użytkowników, dopóki jeden z współbieżnych użytkowników się nie rozłączy.

Byłem podekscytowany możliwością korzystania z transmisji strumieniowej Rails i zdarzeń wysłanych przez serwer w moim projekcie rails, ale z takim podejściem ryzykuję osiągnięcie limitu maksymalnych wątków określonych na moim serwerze internetowym, przez co aplikacja przestaje reagować na wszystkich użytkowników współbieżny użytkownik rozłącza się.

Nie jesteś pewien, jaka jest typowa maksymalna liczba wątków dla Puma dla dużej współbieżnej bazy użytkowników.

Czy powinienem rozważyć inne podejścia - być może oparte na ajaxowym odpytywaniu lub Node.js, które używa opartego na zdarzeniach, nieblokującego się modelu we/wy? Lub po prostu uruchomić niektóre testy porównawcze, aby dowiedzieć się, jaka może być maksymalna liczba wątków?

Odpowiedz

2

Aktualnie pracuję nad projektem, w którym przeszliśmy z sondowaniem z powodu problemów z połączeniem otwartym. Doszliśmy do wniosku, że łatwiej będzie odpytywać co trzy sekundy, a następnie utrzymywać połączenie otwarte i wiszące. Jednak wymagania dotyczące świeżości danych nie były zbyt rygorystyczne, ponieważ trwały trzy sekundy, więc było to wykonalne i głupio było zmarnować wątek na trzy sekundy.

Więc jeśli nie masz bardzo surowych wymagań dotyczących świeżości danych i/lub masz ograniczoną bazę użytkowników i/lub możliwość posiadania wielu wątków, regularne pollingowanie jest zwykle drogą do zrobienia.

Z drugiej strony, jeśli będą stale trafiać na serwer, a ponowne zbieranie danych będzie wymagało więcej czasu niż wymagania dotyczące świeżości danych, równie dobrze można zachować połączenie otwarte, aby uniknąć konieczności radzenia sobie z cały stos ponownie.

Również w puma 2, można również uruchomić go w trybie klastra, co oznacza, że ​​spawnuje robotników dodatkowych z własnymi wątkami i możesz zakończyć wątkami Workers X = Total Threads. Które mogą pomóc w twoich obliczeniach.

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

Powiązane problemy