C# mongos中可裁剪光标的意外行为

C# mongos中可裁剪光标的意外行为,c#,mongodb,mongodb-.net-driver,C#,Mongodb,Mongodb .net Driver,我正准备将我的MongoDB副本集更改为shard cluster。我的应用程序中有以下代码: var cursor = _messages .Find(Query<Message>.GTE(x => x.Timestamp, fromTimestamp)) .SetFlags(QueryFlags.TailableCursor | QueryFlags.AwaitData) .SetMaxTime(TimeSpan.FromMinutes(30))

我正准备将我的MongoDB副本集更改为shard cluster。我的应用程序中有以下代码:

var cursor = _messages
    .Find(Query<Message>.GTE(x => x.Timestamp, fromTimestamp))
    .SetFlags(QueryFlags.TailableCursor | QueryFlags.AwaitData)
    .SetMaxTime(TimeSpan.FromMinutes(30))
    .SetSortOrder(SortBy.Ascending("$natural"));

foreach (var message in enumerateCursor(cursor, cancellationToken))
{
    // do stuff
}
因此,我的问题是:如果我替换我的应用程序MongoDB连接字符串以连接到mongos(碎片群集)而不是mongod(副本集),
cursor.isServerWaitable
等于
false
,因此我必须不断轮询我的数据库服务器,而不是等待新数据

是否有人知道这是mongos的一个局限性,或者是某种微妙的环境导致了这种行为

我使用:

  • MongoDB v。3.2.11
  • MongoDB C#驱动程序v。1.10.0.62
    private static IEnumerable<Message> enumerateCursor(MongoCursor<Message> messages, CancellationToken cancellationToken)
    {
        using (var cursor = new MongoCursorEnumerator<Message>(messages))
        while (!cancellationToken.IsCancellationRequested)
        {
            // some other code to enumerate a cursor...
            // ...and here comes the fallback:
            if (!cursor.IsServerAwaitCapable)
            {
                _logger.Warn("Server await is disabled, falling back to polling.");
                Thread.Sleep(TimeSpan.FromMilliseconds(100));
            }
        }
    }