C# mongos中可裁剪光标的意外行为
我正准备将我的MongoDB副本集更改为shard cluster。我的应用程序中有以下代码: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))
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));
}
}
}