Новое в 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.