CosmosDb - Операция записи привела к ошибке. Ошибка = 16500 - PullRequest
2 голосов
/ 25 марта 2020

У меня есть база данных, использующая 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: enter image description here

1 Ответ

2 голосов
/ 30 марта 2020

В настоящее время мы запускаем приватный предварительный просмотр новой функции для повторных попыток на стороне сервера для пользователей MongoDB, и я думаю, что это будет полезно для того, что вы здесь делаете.

Как это работает, когда встречаются 429, мы будем автоматически повторять запросы до 60 секунд, прежде чем вернуться к пользователю. Наше тестирование показывает, что это решает почти все проблемы, с которыми сталкиваются клиенты, когда вы выполняете массовую загрузку с клиентами MongoDB, как вы, или используете такие инструменты, как mongoimport.

Если вы заинтересованы в участии в этом частном предварительном просмотре, пожалуйста, напишите мне на моем В профиле Twitter отмечен ваш адрес электронной почты и имена учетных записей Cosmos DB, для которых вы хотели бы, чтобы мы включили эту функцию.

Спасибо.

...