Как развернуть поточно-безопасное асинхронное приложение Rails?

Я прочитал в Интернете массу материалов о безопасности потоков и производительности в различных версиях ruby ​​и rails, и мне кажется, что я достаточно хорошо понимаю эти вещи на данный момент.

Чего, как ни странно, не хватает в обсуждениях, так это того, как на самом деле развернуть асинхронное приложение Rails. Говоря о потоках и синхронности в приложении, люди хотят оптимизировать две вещи:

  1. использование всех ядер ЦП с минимальным использованием оперативной памяти
  2. возможность обслуживать новые запросы, пока предыдущие запросы ожидают ввода-вывода

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?

8
задан John Bachir 16 November 2011 в 04:52
поделиться