12

最近、Web アプリケーションを MongoDB C# Driver 2.0 にアップグレードし、運用環境にデプロイしました。特定の負荷を下回ると、アプリケーションは正常に動作します。本番サーバーの負荷が特定の制限を超えると、アプリケーションの CPU は即座に 0 に低下し、約 30 秒後に、この例外が数回ログに記録されます。

System.TimeoutException message: A timeout occured after 30000ms selecting a server using CompositeServerSelector{ Selectors = ReadPreferenceServerSelector{ ReadPreference = { Mode = Primary, TagSets = System.Collections.Generic.List`1[MongoDB.Driver.TagSet] } }, LatencyLimitingServerSelector{ AllowedLatencyRange = 00:00:00.0150000 } }. Client view of cluster state is { ClusterId : "1", Type : "Standalone", State : "Disconnected", Servers : [{ ServerId: "{ ClusterId : 1, EndPoint : "Unspecified/10.4.0.113:27017" }", EndPoint: "Unspecified/10.4.0.113:27017", State: "Disconnected", Type: "Unknown" }] }.
stack trace:
at MongoDB.Driver.Core.Clusters.Cluster.ThrowTimeoutException(IServerSelector selector, ClusterDescription description)
at MongoDB.Driver.Core.Clusters.Cluster.<WaitForDescriptionChangedAsync>d__18.MoveNext()
--- End of stack trace

次のように開始されるシングルトン MongoClient オブジェクトを使用しています。

private static object _syncRoot = new object();

private static MongoClient _client;
private static IMongoDatabase _database;

private IMongoDatabase GetDatabase()
{
    ...

    if (_client == null)
    {
        lock (_syncRoot)
        {
            if (_client == null)
            {
                _client = new MongoClient(
                    new MongoClientSettings
                    {
                        Server = new MongoServerAddress(host, port),
                        Credentials = new[] { credentials },
                    });

                _database = _client.GetDatabase("proddb");
                return _database;
            }
        }
    }
    return _database;
}

public IMongoCollection<T> GetCollection<T>(string name)
{
    return GetDatabase().GetCollection<T>(name);
}

データベースへの典型的な呼び出しは次のようになります。

public async Task<MongoItem> GetById(string id)
{
    var collection = _connectionManager.GetCollection<MongoItem>("items");
    var fdb = new FilterDefinitionBuilder<MongoItem>();
    var f = fdb.Eq(mi => mi.Id, id);
    return await collection.Find(f).FirstOrDefaultAsync();
}

この問題の原因を突き止め、修正するにはどうすればよいでしょうか?

4

4 に答える 4

2

ドライバー v2.2.4 を使用して同じ問題が発生していました。v2.3.0にアップグレードした後、問題は解決されたようです

于 2016-11-09T10:17:43.273 に答える
0

MongoLab で無料 (バージョン 2.6) サンドボックスを使用していたときに同じ問題が発生し、有料のクラスターを使用し始めたときにタイムアウトの問題がなくなりました。

問題は、MongoDB バージョン 3.0+ のみがサポートされていることだと思っていたと言うつもりでした (同じことを言っているドキュメントを見つけたので、MongoLab 経由で 3.0 アップグレード プロセスを実行したことを誓います)。ドキュメントには、2.6がサポートされていると表示されており、有料のMongoLab DBはまだバージョン2.6.9であると表示されています。

私は気が狂っているに違いないと思いますが、少なくとも私のコードは動作しています!

于 2015-08-06T00:19:48.630 に答える