Mongoid を使用して mongodb への接続を維持して以来、奇妙な問題が発生しました。これは元々、Rails 4.0+ (Mongoid/Moped の更新が必要) へのアップグレードが原因だと思っていましたが、他の Rack ベースのアプリ (具体的には Sinatra と Grape) でもこの問題が発生しました。
安定版がリリースされた後、mongodb インスタンスを 2.4 から 2.6 に更新しましたが、この問題は 2.4 にもありました。
Github ( https://github.com/mongoid/moped/issues/274 )の問題にこれを書きましたが、ここにコピーします。
TL;DR バージョンでは、Mongoid を使用してクエリを実行しようとすると、アプリがランダムにハングします。これは、Rails コンソールを使用している場合でも、アプリが実行中 (またはデプロイ済み) の場合でも発生します。コンソールにいる場合、CTRL + C を押してからリクエストを再試行すると常に機能するため、これは何らかの接続の問題であると思われます。
私のモンゴイド構成は次のようになります。
mongoid.yml
default: &default
sessions:
default:
uri: "mongodb://localhost:27017/database"
options:
timeout: 15
retry_interval: 1
max_retries: 5
pool_size: 10
development:
<<: *default
「リモート」mongodb インスタンスを参照するように接続の詳細を変更すると、定期的な接続の問題が発生し始めます。
mongoid.yml
default: &default
sessions:
default:
uri: "mongodb://remote-mongodb-url:27017/database"
options:
timeout: 15
retry_interval: 1
max_retries: 5
pool_size: 10
development:
<<: *default
この問題は次のように現れます。
1) Web アプリケーションが完全に応答しなくなります (リクエストがハングするだけです) 2) Rails のログに異常は見られません (Moped と Mongoid のログ レベルが DEBUG に設定されていても)
元:
Started GET "/accounts" for 172.16.3.180 at 2014-04-23 09:11:34 -0400
Processing by AccountsController#index as HTML
複数の Web サーバー (Webrick、Puma、Unicorn) を使用してみましたが、すべて同じ問題が発生します。
3) アプリケーション サーバーを強制終了すると (CTRL+C)、次のように表示されます。
Started GET "/accounts" for 172.16.3.180 at 2014-04-23 09:11:34 -0400
Processing by AccountsController#index as HTML
^C[2014-04-23 09:12:52] INFO going to shutdown ...
^CExiting
D, [2014-04-23T09:12:53.516499 #4673] DEBUG -- : MOPED: 168.62.164.129:27017 COMMAND database=admin command={:ismaster=>1} runtime: 78545.7536ms
Completed 401 Unauthorized in 78638ms
/home/alex/.rvm/gems/ruby-2.1.1/gems/rack-1.5.2/lib/rack/handler/webrick.rb:25:in `shutdown': undefined method `shutdown' for nil:NilClass (NoMethodError)
ここで奇妙なのは、アプリケーションを本番環境 (mongodb と同じサーバー上にあり、mongoid.yml
localhost:27017 の接続が設定されている) にデプロイした場合、問題がないことです。