我想将我的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的限制,或者有一些微妙的设置会导致这种行为?
我用: