Подтвердить что ты не робот

Сервер отправил события, Puma, Rails и максимальные выделенные потоки для каждого клиента

Я использую Redis для моего проекта rails для подписки на каналы и публикации на тех каналах, когда происходит событие. На стороне клиента я регистрируюсь на EventSource, который соответствует этим каналам. Всякий раз, когда происходит событие для подписанного канала на сервере, сервер выполняет запись SSE, чтобы все зарегистрированные клиенты получали обновление.

Теперь соединение с сервером остается в живых для каждого клиента, который подписан на эти каналы, то есть серверный поток, выделенный этому клиенту, продолжает работать до тех пор, пока клиент не отключится. При таком подходе, если есть 1000 одновременных пользователей, подписанных на канал, у меня будет 1000 соединений TCP/IP.

Я использую Puma как веб-сервер, как это предлагается в этом учебнике. По умолчанию Puma задает 16 максимальных потоков. Я могу изменить этот предел на более высокий предел.

Возможно, я не знаю, сколько одновременных пользователей может быть одновременно в моем приложении и не знает, что такое max no. потоков, которые я могу указать в Puma. В худшем случае, если количество потоков, посвященных каждому параллельному пользователю, достигает максимального количества потоков, заданных для веб-сервера Puma, приложение замерзает для всех пользователей, пока один из параллельных пользователей не отключится.

Я был рад использовать Rails в прямом эфире, а сервер отправил события в моем проекте rails, но при таком подходе я рискую достичь предела максимальных потоков, указанных на моем веб-сервере, и, следовательно, приложение становится невосприимчивым для всех пользователей до тех пор, пока один из одновременное отсоединение пользователя.

Не уверен, что типичное максимальное количество потоков для Puma для большой параллельной базы пользователей.

Должны ли я рассматривать другие подходы - возможно, на основе ajax-опроса или Node.js, который использует управляемую событиями, неблокирующую модель ввода-вывода? Или просто запустите некоторые тесты, чтобы узнать, сколько может быть мое максимальное количество потоков?

4b9b3361

Ответ 1

Я действительно работаю над проектом, в котором мы пошли с опросом из-за проблем с открытым подключением. Мы полагали, что было бы проще проводить опрос каждые три секунды, а затем поддерживать соединение открытым и висящим. Но требование свежести данных было не очень строгим, это три секунды, поэтому это было выполнимо, и вроде глупо тратить нить на три секунды.

Поэтому, если у вас нет очень строгих требований к свежести данных и/или иметь ограниченную базу пользователей и/или способность иметь много потоков, обычным опросом обычно является путь.

И, с другой стороны, если они будут постоянно ударять по вашему серверу, и потребуется больше времени для повторного опроса данных, а затем вашего требования к свежести данных, вы можете также поддерживать соединение открытым, чтобы не иметь дело с весь стек снова.

Также в puma 2 вы также можете запускать его в режиме кластера, что означает, что он порождает добавочных работников с собственными потоками, и вы можете закончить Workers X Threads = Total Threads. Что может помочь в ваших расчетах.

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