Почему контроллер barebones Rails блокируется, если база данных не работает?

У меня есть простой контроллер Rails, который не зависит от базы данных.

class PingController < ActionController::Base
  def ping
    render text: 'The service is up'
  end
end

Однако, когда база данных опускается, это блокирует действие контроллера. Почему это происходит?

Ответ 1

Я думаю, что могут быть три виновника.

В новом приложении Rails есть следующее промежуточное программное обеспечение (Источник):

use Rack::Sendfile
use ActionDispatch::Static
use Rack::Lock
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x000000029a0838>
use Rack::Runtime
use Rack::MethodOverride
use ActionDispatch::RequestId
use Rails::Rack::Logger
use ActionDispatch::ShowExceptions
use ActionDispatch::DebugExceptions
use ActionDispatch::RemoteIp
use ActionDispatch::Reloader
use ActionDispatch::Callbacks
use ActiveRecord::Migration::CheckPending
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
use ActionDispatch::Flash
use ActionDispatch::ParamsParser
use Rack::Head
use Rack::ConditionalGet
use Rack::ETag
run Rails.application.routes

Каждый запрос вашего контроллера по существу проходит через каждое из этих промежуточных звеньев в цепочке один за другим.

Три из них связаны с базой данных и, следовательно, зависят от базы данных для каждого запроса. Вы заметите, что все они являются частью ActiveRecord, которая является большой подсказкой для базы данных.

  • ActiveRecord::Migration::CheckPending

    Это проверяет, есть ли ожидающие миграции в базе данных, прежде чем передавать запрос. Из того, что я могу сказать, глядя на исходный код, он проверяет ожидающие миграции в всех средах.

  • ActiveRecord::ConnectionAdapters::ConnectionManagement

    За исключением среды тестирования, это промежуточное ПО очищает активные соединения db каждый запрос. Возможно, подключение к базе данных в этом промежуточном программном обеспечении блокирует действие вашего контроллера.

  • ActiveRecord::QueryCache

    Это также может блокировать запросы базы данных. Он активен для всех сред, что я могу сказать.

Ответ 2

Rails проверяет ожидающие миграции (по крайней мере, в режиме разработки) перед запросом. Я предполагаю, что эта проверка блокирует ваше несвязанное действие db, когда ваша база данных опускается.