У меня есть база данных, использующая MongoDB на CosmosDB.
Вот мой шаблон повторов с использованием 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));
А вот код, используемый для выполнения UpdateMany
с MongoDb драйвер в C#:
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:
Операция записи привела к ошибке. Ошибка = 16500, RetryAfterMs = 12, Подробности = 'Операция массовой записи привела к одной или нескольким ошибкам. Ошибка = 16500, RetryAfterMs = 12, Подробности = '
MongoDB.Driver.MongoBulkWriteException`1 [[MongoDB.Bson.BsonDocument, MongoDB.Bson, Версия = 2.8.1.0, Культура = нейтральная, PublicKeyToken = null]]
После этой документации я знаю, что код ошибки 16500 - это проблема с RU / se c в базе данных. Но это MongoBulkWriteException
, поэтому мне интересно, обрабатывается ли он политикой повтора
Следуя этой документации, MongoBulkWriteException
не наследуется от MongoCommandException
. Можете ли вы подтвердить, что политика повторных попыток Полли в этом случае не применяется?
РЕДАКТИРОВАТЬ : при просмотре панели управления CosmosDb на Azure похоже, что UpdateMany
стоит лот RU: