Abbiamo recentemente aggiornato la nostra applicazione Web a MongoDB C# Driver 2.0 e distribuita alla produzione. Sotto un certo carico, l'applicazione funziona correttamente. Quando il carico sul server di produzione supera un certo limite, la CPU dell'applicazione cade velocemente fino a 0 e dopo circa 30 secondi, questa eccezione viene registrato più volte:MongoDB C# 2.0 TimeoutException
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
Usiamo un oggetto MongoClient singoletto, che è iniziato in questo modo:
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);
}
Una chiamata tipica a base di dati simile a questo:
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();
}
Come possiamo scoprire il motivo e risolvere questo problema?
questo sta andando a prendere molto di più diagnosi. Puoi presentare un ticket sotto il progetto CSHARP su jira.mongodb.org? Posso dirvi per iniziare che l'eccezione ci dice che non siamo più collegati al server. È successo qualcosa che ci ha fatto perdere la connettività. Quindi, una cosa che mi piacerebbe vedere sono i log dal server (sembra che tu abbia solo 1 in esecuzione in modalità standalone). –
Ricevo sempre la stessa eccezione di timeout nell'app MV.NET di ASP.NET ma utilizzando la stessa libreria da un'app console, non la vedo mai. –
Hai capito come correggere il tuo errore? – RPDeshaies