Улучшения Rack::Timeout для Rails
Добавьте эту строку в Gemfile вашего приложения:
gem "slowpoke"
И запустите:
rails generate slowpoke:install
При этом создается файл public/503.html
который вы можете настроить.
Чтобы опробовать собственные страницы ошибок в разработке, временно добавьте в config/environments/development.rb
:
config . slowpoke . timeout = 1
config . consider_all_requests_local = false
И добавьте вызов sleep
к одному из ваших действий:
sleep ( 2 )
Должна появиться пользовательская страница ошибки.
Тайм-аут по умолчанию составляет 15 секунд. Вы можете изменить это в config/environments/production.rb
с помощью:
config . slowpoke . timeout = 5
Для динамических таймаутов используйте:
config . slowpoke . timeout = lambda do | env |
request = Rack :: Request . new ( env )
request . path . start_with? ( "/admin" ) ? 15 : 5
end
Подпишитесь на таймауты с помощью:
ActiveSupport :: Notifications . subscribe "timeout.slowpoke" do | name , start , finish , id , payload |
# report timeout
end
Дополнительные сведения см. в документации Rack::Timeout.
Rack::Timeout может вызвать исключение в любой точке кода, что может привести к тому, что ваше приложение окажется в нечистом состоянии. Самый безопасный способ восстановиться после тайм-аута запроса — создать новый процесс. Это поведение по умолчанию для Slowpoke.
Для многопоточных серверов, таких как Puma, это означает уничтожение всех потоков, когда время ожидания одного из них истекает. Это может оказать существенное влияние на производительность.
Вы можете настроить это поведение с помощью:
Slowpoke . on_timeout do | env |
next if Rails . env . development? || Rails . env . test?
exception = env [ "action_dispatch.exception" ]
if exception && exception . backtrace . first . include? ( "/active_record/" )
Slowpoke . kill
end
end
Примечание. Чтобы получить доступ к env["action_dispatch.exception"]
в разработке, временно добавьте в config/environments/development.rb
:
config . consider_all_requests_local = false
Рекомендуется установить тайм-аут оператора и тайм-аут соединения. Для Postgres ваш config/database.yml
должен включать что-то вроде:
production :
connect_timeout : 3 # sec
variables :
statement_timeout : 5s
Посмотреть журнал изменений
Приглашаем всех помочь улучшить этот проект. Вот несколько способов, которыми вы можете помочь:
Для начала разработки:
git clone https://github.com/ankane/slowpoke.git
cd slowpoke
bundle install
bundle exec rake test