使用mongos的tailable游标的意外行为

时间:2017-01-13 10:00:22

标签: c# mongodb mongodb-.net-driver

我想将我的MongoDB副本集更改为分片群集。我的应用程序中有以下代码:

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
}

正如您所看到的,它创建了一个tailable游标并传递AwaitData标志,告诉服务器如果没有与查询匹配的数据,它不应该立即返回。如果mongo服务器不支持等待tailable游标,enumerateCursor方法有一个回退,如下所示:

    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));
            }
        }
    }

所以我的问题是:如果我将我的应用程序MongoDB连接字符串替换为mongos(shard cluster)而不是mongod(副本集),cursor.IsServerAwaitCapable等于false,所以不要等待对于新数据,我必须不断轮询我的数据库服务器。

有没有人知道它是否是mongos的限制,或者有一些微妙的设置会导致这种行为?

我用:

  • MongoDB v.3.2.11
  • MongoDB C#驱动程序v 1.10.0.62

0 个答案:

没有答案