3

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.ymllocalhost:27017 の接続が設定されている) にデプロイした場合、問題がないことです。

4

0 に答える 0