Новое в Rails 4: безопасное использование многопотового кода по умолчанию
Большое изменение в Rails 4 - то, что приложения теперь ориентированы на многопотоковое исполнение по умолчанию. Это дает огромные выигрыши в производительности приложений, поскольку они будут в состоянии обслуживать больше чем один запрос одновременно.
Ориентированный на многопотоковое исполнение код
Если Вы используете рабочий веб-сервер, который допускает параллелизм, такой как Puma, Вы должны гарантировать, что весь Ваш код ориентирован на многопотоковое исполнение, включая все gem-ы которые использует ваше приложение. Вы должны быть уверены, что каждый gem, включенный в Ваш проект, ориентирован на многопотоковое исполнение.
Как только все gem-ы будут проверены на корректное исполнение многопотокового кода, следующий шаг - изучить Ваш собственный код проекта. Просмотрите свое приложение в поисках совместно используемых частей кода, таких как:
переменные класса
константы
глобальные переменные
Вот пример кода многопотокового исполнения долгого конкурентного вычисления, используя Mutex:
class SomeClass
@lock = Mutex.new
class << self
def some_calculation
@lock.synchronize do
@calc ||= heavy_operation
end
end
end
end
Используемый веб-сервер
Если Вы используете веб-сервер, такой как Unicorn, даже если Ваше приложение ориентированно на многопотоковое исполнение, то все запросы будут все еще работать в изоляции. Каждый рабочий процесс выполняет единственный поток за один раз. Однако, поскольку Rails теперь ориентировано на многопотоковое исполнение по умолчанию, у Вас нет необходимости включения в ваш код middleware Rack::Lock в каждом запросе.
Rails будет автоматически включать Rack::Lock, если ваше приложение исполняется на многопотоковом веб-сервере, таком как WEBrick.
Большое изменение в Rails 4 - то, что приложения теперь ориентированы на многопотоковое исполнение по умолчанию. Это дает огромные выигрыши в производительности приложений, поскольку они будут в состоянии обслуживать больше чем один запрос одновременно.
Ориентированный на многопотоковое исполнение код
Если Вы используете рабочий веб-сервер, который допускает параллелизм, такой как Puma, Вы должны гарантировать, что весь Ваш код ориентирован на многопотоковое исполнение, включая все gem-ы которые использует ваше приложение. Вы должны быть уверены, что каждый gem, включенный в Ваш проект, ориентирован на многопотоковое исполнение.
Как только все gem-ы будут проверены на корректное исполнение многопотокового кода, следующий шаг - изучить Ваш собственный код проекта. Просмотрите свое приложение в поисках совместно используемых частей кода, таких как:
Вот пример кода многопотокового исполнения долгого конкурентного вычисления, используя
Mutex
:Используемый веб-сервер
Если Вы используете веб-сервер, такой как Unicorn, даже если Ваше приложение ориентированно на многопотоковое исполнение, то все запросы будут все еще работать в изоляции. Каждый рабочий процесс выполняет единственный поток за один раз. Однако, поскольку Rails теперь ориентировано на многопотоковое исполнение по умолчанию, у Вас нет необходимости включения в ваш код middleware
Rack::Lock
в каждом запросе.Rails будет автоматически включать
Rack::Lock
, если ваше приложение исполняется на многопотоковом веб-сервере, таком как WEBrick.