4

MongoDB 接続が数分間アイドル状態になると、次のリクエストがエラーで終了します。コマンド ライン クライアントからは、mongo次のようになります。

> db.users.find()
Sat Jan 12 23:42:35 Socket recv() errno:54 Connection reset by peer 107.22.25.25:47207
Sat Jan 12 23:42:35 SocketException: remote: 107.22.25.25:47207 error: 9001 socket exception [1] server [107.22.25.25:47207] 
Sat Jan 12 23:42:35 DBClientCursor::init call() failed
Sat Jan 12 23:42:35 query failed : chowology.users {} to: ds047207.mongolab.com:47207
Error: error doing query: failed
Sat Jan 12 23:42:35 trying reconnect to ds047207.mongolab.com:47207
Sat Jan 12 23:42:35 reconnect ds047207.mongolab.com:47207 ok

MongoHQ と MongoLab のサンドボックス インスタンスに対して問題が発生しています。

再接続により、次のリクエストは正常に処理されます。これは私の Web アプリの問題です。数分間操作を行わないと、Web リクエスト中にこのエラーが発生するからです。私を驚かせたことが2つあります。

  1. その MongoDB 接続は非常に定期的かつ頻繁に破棄されます。
  2. 再接続後に自動的に再試行するのではなく、ドライバーが単に例外を発生させること (私は、mongoose を使用する connect-mongo を使用し、次にnode-mongodb-nativeを使用します)。

これは他のみんなの経験ですか?これはどのように扱われるべきですか?アプリ開発者がデータベース操作を再試行例外処理のナンセンスでラップすると、私は驚かれることでしょう。

4

3 に答える 3

3

Server オブジェクトのドキュメントを見たい

http://mongodb.github.com/node-mongodb-native/api-generated/server.html#server

特に、keepAlive と接続タイムアウトを設定できる socketOptions です。デフォルトでは、キープアライブはオフで、タイムアウトは 0 またはなしです。これは、OS のデフォルト ソケット タイムアウトが有効であることを意味します (OS ごとに異なります)。キープアライブは、tcp ソケット接続に時々パケットを送信して、それを維持します。ファイアウォールの構成が不適切で、接続を閉じたときに終了パケットを送信せず、接続が無効になり、モノグラブの人々が話していることです (多くの場合、正直に言うと、それらは恐ろしく構成されています)。

于 2013-01-15T23:03:56.540 に答える
1
  1. コンピューターがスリープ状態にならないことを確認する
  2. ルーター/ファイアウォールがアイドル状態の接続を強制終了していないことを確認してください

最初の問題は、コンピューターがスリープ状態になり、知らないうちにネットワーク接続が切断されたことであることが判明しました。それは新しいコンピューターであり、スリープを無効にしていないことに気づきませんでした:-P

MongoLab の Jared がこの問題のトラブルシューティングを手伝ってくれました。感謝しています。彼は、ファイアウォールを通過するときにこの動作が一般的であると述べました (mjhm がコメントで示唆したように)。したがって、1つのテストはそれをバイパスすることです。

引き続きルーターを使用すると、数時間アイドル状態になった後、別のエラーが発生します。

db.users.find()
Sun Jan 13 14:55:02 Socket say send() errno:32 Broken pipe 107.22.25.25:47207
Error: 9001 socket exception [2] server [107.22.25.25:47207] 
Sun Jan 13 14:55:02 trying reconnect to ds047207.mongolab.com:47207
Sun Jan 13 14:55:02 reconnect ds047207.mongolab.com:47207 ok

ルーター/ファイアウォールを通過しないサーバーからもう一度試します。

切断された接続は本当に例外的なケースであるため、現在の op で例外を発生させるドライバーの動作は予期され、受け入れられます。

更新: これらの問題は、ルーターをバイパスしても発生せず、Joyent データ センターで実行されていると思われる Nodejitsu インスタンスでも発生しません。

于 2013-01-13T19:04:41.287 に答える