Я прочитал в Интернете массу материалов о безопасности потоков и производительности в различных версиях ruby и rails, и мне кажется, что я достаточно хорошо понимаю эти вещи на данный момент.
Чего, как ни странно, не хватает в обсуждениях, так это того, как на самом деле развернуть асинхронное приложение Rails. Говоря о потоках и синхронности в приложении, люди хотят оптимизировать две вещи:
Point 1 - вот где люди (справедливо) восхищаются JRuby. В этом вопросе я пытаюсь оптимизировать только пункт 2.
Скажем, это единственный контроллер в моем приложении:
TheController < ActionController::Base
def fast
render :text => "hello"
end
def slow
render :text => User.count.to_s
end
end
fast
не имеет операций ввода-вывода и может обрабатывать сотни или тысячи запросов в секунду, и slow
должен отправить запрос по сети, дождаться завершения работы, затем получить ответ по сети, и поэтому он намного медленнее, чем fast
.
Таким образом, идеальное развертывание позволило бы выполнить сотни запросов к быстрому
, в то время как запрос к медленному
ожидает ввода-вывода.
Что, кажется, упускается из дискуссий в сети, так это того, какой уровень стека отвечает за включение этого параллелизма.thin имеет флаг - thread
, который будет «вызывать приложение Rack в потоках [экспериментальный]» - запускает ли это новый поток для каждого входящего запроса? Спулинг экземпляров стоечного приложения в потоках, которые сохраняются и ждут входящих запросов?
Тонкий - единственный способ или есть другие? Имеет ли значение среда выполнения ruby для оптимизации пункта 2?