来自 mongo 具有异步 API 的 c# 驱动程序的超时异常

TimeoutExceptions from mongo c# driver with Async API

我们使用来自 MongoDB (2.0.0-beta2) 的最新测试版驱动程序,具有所有异步功能。但与旧实现 (1.10.0-rc0) 相比,我们遇到了一些奇怪的 TimeoutExceptions。我们尝试了不同的服务器版本(其中包括 3.0.0-rc10),但这似乎没有影响。

System.TimeoutException occurred
  HResult=-2146233083
  Message=Operation timed out after 00:00:30.
  Source=MongoDB.Driver
  StackTrace:
       at MongoDB.Driver.OperationExecutor.<ExecuteReadOperationAsync>d__0`1.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
       at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
       at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
       at MongoDB.Driver.MongoCollectionImpl`1.<ExecuteReadOperation>d__5e`1.MoveNext()

我们很难重现这一点,触发几千次插入、更新和查找不会触发此错误。但是,运行 我们的 .NET Web 应用程序确实会触发此事件(在创建几个新实体之后)。

异常位置不同,但其中一个位置在我们的 FindAll 方法中。我们的代码:

IMongoCollection<BsonDocument> col = _database.GetCollection<BsonDocument>(GetCollectionName(qmoType));
IFindFluent<BsonDocument, BsonDocument> findFluent = col.Find(MongoDBWhereBuilder.BuildWhere(where));

findFluent = findFluent.Sort(SortBy.Ascending(sort.Keys.ToArray());
findFluent = findFluent.Skip(skip);
findFluent = findFluent.Limit(take);

List<BsonDocument> list = await findFluent.ToListAsync();

_database 变量在所有请求之间共享(它在启动时创建一次)。

我们怎样才能更好地解决这个问题?或者还有其他人有这个问题吗?

这是 beta2 驱动程序中的错误。该修复程序已合并到 master(和 beta3 的一部分)中:https://jira.mongodb.org/browse/CSHARP-1184

我认为这可能仍然存在于版本 2.0.1/2.1.0 中。我们不得不降级到 1.10.0,这是我们以前的版本,这使得连接数回到 100 以下,响应时间减少到 100 毫秒以下(有时从 500-600 毫秒)。

也许在导致延迟的异步代码周围的遗留包装器中有一些东西。