![](/img/trans.png)
[英]MongoWriteException: A write operation resulted in an error. The positional operator did not find the match needed from the query
[英]CosmosDb - A write operation resulted in an error. Error=16500
我有一个在 CosmosDB 上使用 MongoDB 的数据库。
这是我使用 Polly 的重试模式:
_retryPolicy = Policy
.Handle<MongoCommandException>(e =>
{
if (e.Code != 16500 /*(RateLimitCode)*/ || !(e.Result is BsonDocument bsonDocument))
{
return false;
}
if (bsonDocument.TryGetValue("StatusCode", out var statusCode) && statusCode.IsInt32)
{
switch (statusCode.AsInt32)
{
case 429: //HttpThrottleErrorCode
case 1: //HttpServiceIsUnavailable
case 50: //HttpOperationExceededTimeLimit:
return true;
default:
return false;
}
}
return true;
})
.Or<MongoConnectionException>()
.WaitAndRetryAsync(2, i => TimeSpan.FromSeconds(MongoRepositoryConstants.RETRY_POLICY_TIME_OUT_IN_SECOND));
这是用于在 C# 中使用 MongoDb 驱动程序执行UpdateMany
的代码:
public async Task<bool> UpdateManyAsync(IEnumerable<JObject> listRelatedQuotes, DateTime datetime, string quoteStatus)
{
var listQuoteNumber = new BsonArray(listRelatedQuotes.Select(quote => quote[StdJsonDataLabel.toto][StdJsonDataLabel.QUOTE_IDENTIFIER_LABEL].ToString()));
FilterDefinition<BsonDocument> filter = Builders<BsonDocument>.Filter.In(StdJsonDataPath.toto, listQuoteNumber);
var update = Builders<BsonDocument>.Update.Set(StdJsonDataPath.fooooo, datetime.ToString("o"));
if (!string.IsNullOrEmpty(quoteStatus))
{
update = update.Set(StdJsonDataPath.foooo2, quoteStatus);
}
bool res = false;
await _retryPolicy.ExecuteAsync(async () =>
{
var result = await _collection.UpdateManyAsync(filter, update).ConfigureAwait(false);
res = (result.MatchedCount > 0);
});
return res;
}
不幸的是,我在 CosmosDb 上遇到了以下问题:
写操作导致错误。 Error=16500, RetryAfterMs=12, Details=' 批量写入操作导致一个或多个错误。 错误=16500,RetryAfterMs=12,详细信息=”
MongoDB.Driver.MongoBulkWriteException`1[[MongoDB.Bson.BsonDocument, MongoDB.Bson, Version=2.8.1.0, Culture=neutral, PublicKeyToken=null]]
按照此文档,我知道 16500 错误代码是数据库上 RU/sec 的问题。 但它是一个MongoBulkWriteException
所以我想知道它是否由重试策略处理
根据本文档, MongoBulkWriteException
不继承自MongoCommandException
。 那么您能否确认 Polly 重试策略在这种情况下不适用?
我们目前正在为 MongoDB 用户的服务器端重试新功能运行私人预览版,我认为这将有益于您在此处所做的工作。
这是如何工作的,当遇到 429 时,我们将在返回给用户之前自动重试请求长达 60 秒。 我们的测试表明,这几乎解决了客户在使用 MongoDB 客户端进行批量摄取或使用 mongoimport 等工具时遇到的几乎所有问题。
如果您有兴趣参与此私人预览版,请在我的 Twitter 个人资料 markjbrown 上给我 DM,并附上您希望我们为其启用此功能的电子邮件地址和 Cosmos DB 帐户名。
谢谢。
回答您的问题,是的,此策略不会处理批量写入期间的限制错误。
您需要另外处理MongoBulkWriteException
。 比您应该查看此异常的内容,遍历WriteErrors
集合并检查特定元素是否因节流而出错并安排重试(理想情况下,从此类失败记录组成新的批量写入集合)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.