2015-09-16 7 views
12

私はデータベースに依存しない単純なRailsコントローラを持っています。データベースがダウンしている場合、ベアボーンのRailsコントローラがブロックするのはなぜですか?

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

ただし、データベースがダウンすると、このコントローラの動作がブロックされます。 なぜこれが起こりますか?

+0

IMOこれは、ご使用の環境によって異なります。あなたはどのようなサーバーを使用していますか?あなたは '開発'または '生産'環境にいますか?この動作をテストするとき、またはサーバが起動したか、またはより長い時間アイドル状態になったときに、サーバはしばらくの間実行されていますか? – spickermann

+0

あなたのミドルウェアを調べることをお勧めします。そのうちの1つは、データベースとの間で入出力のブロッキングを簡単に使用する可能性があります。ここにミドルウェアスタックを投稿してください。 – mudasobwa

+0

「ブロックする」とはどういう意味ですか?何か間違いがありますか? – AJFaraday

答えて

0

Railsは、要求の前に(少なくとも開発モードで)保留中の移行をチェックします。私はあなたのデータベースがダウンすると、このチェックはあなたのdb無関係のアクションをブロックすると思います。

2

私は3つの犯人があると思います。

新鮮Railsアプリケーションは、次のミドルウェア(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 

コントローラーへの各要求は、本質的に鎖にこれらのミドルウェアのそれぞれ、次々に通過します。これらの

3つのデータベースに関連しているので、リクエストごとにデータベースに依存します。あなたは彼らがすべての部分であることに気付くでしょうActiveRecordこれは、データベースが関与する大きなヒントです。

  1. ActiveRecord::Migration::CheckPending

    、データベース内の保留中のマイグレーションが通過要求を渡す前にある場合、これがチェックされます。ソースコードを見ればわかるように、のの保留中の移行をチェックします。テスト環境を除き

  2. ActiveRecord::ConnectionAdapters::ConnectionManagement

    、このミドルウェアは、各要求アクティブDB接続をパージします。おそらく、このミドルウェアのデータベース接続がコントローラの動作をブロックしている可能性があります。

  3. ActiveRecord::QueryCache

    これは、データベース要求をブロックすることができます。私はそれがすべての環境に対して有効であると私は理解しています。

関連する問題