3

Django アプリケーションから、PyMongo と gevent を一緒に使用しています。本番環境では、Gunicorn でホストされています。

アプリケーションの起動時に単一の Connection オブジェクトを作成しています。バックグラウンド タスクを継続的に実行し、数秒ごとにデータベース操作を実行しています。

このアプリケーションは、Django アプリと同様に HTTP リクエストも処理します。

私が抱えている問題は次のとおりです。本番環境でのみ発生します。開発環境では再現できませんでした。アプリケーションをしばらくアイドル状態にすると (バックグラウンド タスクはまだ実行されています)、最初の HTTP 要求 (実際には最初のいくつか) で、実行する最初の「検索」操作が完了しません。グリーンレットは実際には再開しません。これにより、最初のいくつかの HTTP 要求がタイムアウトします。

どうすれば修正できますか?それは gevent や PyMongo のバグですか?

4

1 に答える 1

4

私は問題が何であるかを見つけました。デフォルトでは、PyMongoには接続にネットワークタイムアウトが定義されていないため、プール内の接続が切断されました(しばらく使用されていないため)。次に、接続を再利用して「検索」を実行しようとすると、接続が切断されたと検出されるまでに非常に長い時間がかかります(15分程度)。接続が切断されていることが検出されると、「find」呼び出しは最終的にAutoReconnectErrorをスローし、新しい接続が生成されて古い接続に置き換えられます。

解決策は、小さなネットワークタイムアウト(15秒)を設定して、「find」の呼び出しがグリーンレットを15秒間ブロックし、AutoReconnectErrorを発生させ、「find」が再試行されると、新しい接続を取得し、操作は成功します。

于 2012-08-28T16:37:40.013 に答える