2015-09-16 13 views
12

Mam prosty kontroler Rails, który nie zależy od bazy danych.Dlaczego kontroler Rails barebones blokuje, jeśli baza danych nie działa?

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

Jednakże, gdy baza danych przestaje działać, działanie tego kontrolera blokuje się. Dlaczego tak się dzieje?

+0

IMO zależy to od środowiska: z jakiego serwera korzystasz? Czy jesteś w środowisku "rozwoju" lub "produkcji"? Czy serwer działa już od jakiegoś czasu, kiedy testujesz to zachowanie, czy serwer właśnie się uruchomił lub przestał działać przez dłuższy czas? – spickermann

+0

Proponuję, aby zbadać swoje middlewares. Jedna z nich może z łatwością korzystać z blokowania IO do/z bazy danych. Opublikuj tutaj stos oprogramowania pośredniego. – mudasobwa

+0

Co masz na myśli mówiąc "blokuje"? Czy widzisz jakieś błędy? – AJFaraday

Odpowiedz

0

Kontrola railsów dla oczekujących migracji (przynajmniej w trybie deweloperskim) przed żądaniem. Wydaje mi się, że to sprawdzenie blokuje twoje niepowiązane działanie db, gdy twoja baza danych przestaje działać.

2

Myślę, że może być trzech winowajców.

Aplikacja świeże szyn posiada następujące warstwy pośredniej (Source):

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 

Każde żądanie do kontrolera zasadniczo przechodzi przez każdy z tych middleware w łańcuchu, jeden po drugim.

Trzy z nich są powiązane z bazą danych, a zatem zależą od bazy danych dla każdego żądania. Zauważysz, że wszystkie one są częścią ActiveRecord, co jest wielką wskazówką, że baza danych jest zaangażowana.

  1. ActiveRecord::Migration::CheckPending

    ta sprawdza, czy istnieją oczekujące migracje w bazie danych przed przekazaniem wniosku przez. Z tego co widzę patrząc na kod źródłowy, sprawdza on oczekujące migracje w wszystkich środowiskach.

  2. ActiveRecord::ConnectionAdapters::ConnectionManagement

    wyjątkiem enviornment testowania, to middleware czyści aktywne połączenia db każde żądanie. Być może połączenie z bazą danych w tym oprogramowaniu pośredniczącym blokuje działanie kontrolera.

  3. ActiveRecord::QueryCache

    To może być również blokowanie żądań bazy danych. Jest aktywny dla wszystkich środowisk z tego, co mogę powiedzieć.

Powiązane problemy