В настоящее время я рассматриваю возможность перехода на jRuby, и я до сих пор не уверен, как все будет работать, но давайте рассмотрим эту гипотетическую ситуацию.
user 1
загружает страницу в моем приложении, что занимает около 2,5 секунд, и примерно в 500ms
при выполнении user 2
пытается открыть другую страницу, загрузка которой занимает 1 секунду.
Если моя оценка верна, вот что произойдет, если вы запустите его в МРТ с одним процессом:
- Пользователь 1 ждет 2,5 секунды, пока загрузится его страница
- Пользователь 2 ждет 3 секунды, пока его страница загрузится (2 секунды ждет, пока пользователь 1 завершит загрузку своей страницы, и 1 секунда, пока его страница завершит рендеринг)
Верна ли моя оценка?
И скажем, если бы я запустил то же приложение под jRuby, это произошло бы:
- Пользователь 1 ждет 2,5 секунды, пока загрузится его страница
- Пользователь 2 ждет 1 или более секунд, но менее 3, в зависимости от того, сколько памяти/процессора занимает запрос от пользователя 1.
Верна ли моя другая оценка? Конечно, если ваш код является потокобезопасным. Если моя оценка неверна, поправьте меня, или, если она верна, мне нужно убедиться, что какая-то конфигурация установлена на уровне приложения rails, или я должен быть осторожен с чем-то еще, кроме безопасного кода?
Обновлять
Я только что сделал небольшое приложение jRuby POC, использовал гем warbler для создания файла войны и развернул войну на веб-сервере Tomcat. Я не думаю, что моя оценка была правильной для jRuby, вот что я заметил:
- Пользователь 1 ждет 2,5 секунды, пока загрузится его страница
- Пользователь 2 ждет 3 секунды
Что идентично MRI с точки зрения обработки запросов, разве jRuby не должен обрабатывать их параллельно?