sql >> Databasteknik >  >> NoSQL >> MongoDB

CosmosDb Request rate är hög med insertMany

Mongo-drivrutinen berättar vilka poster som fick fel och vilka som inte bearbetades alls. Om alla fel (vanligtvis ett) har kod 16500, då är ditt problem att strypa och försöka igen på fel och återstående poster är säkra. Annars orsakas dina fel av något annat och du bör göra analys och bestämma om du vill fortsätta med omförsök.

Mongo-drivrutinen returnerar inte HTTP-header där Cosmos DB föreslår fördröjning innan ett nytt försök, men det är ingen stor sak. Fördröjning garanterar inte framgång i alla fall, eftersom andra förfrågningar som träffar samma databas kan använda upp RU:er. Du är bättre av att experimentera och bestämma dina egna regler för omförsök. Nedan finns en enkel rekursiv lösning som fortsätter att försöka tills allt är bra eller gränsen för ett nytt försök har nåtts.

    private async Task InsertManyWithRetry(IMongoCollection<BsonDocument> collection, 
        IEnumerable<BsonDocument> batch, int retries = 10, int delay = 300)
    {
        var batchArray = batch.ToArray();

        try
        {
            await collection.InsertManyAsync(batchArray);
        }
        catch (MongoBulkWriteException<BsonDocument> e)
        {
            if (retries <= 0)
                throw;

            //Check if there were any errors other than throttling.
            var realErrors = e.WriteErrors.Where(we => we.Code != 16500).ToArray();
            //Re-throw original exception for now.
            //TODO: We can make it more sophisticated by continuing with unprocessed records and collecting all errors from all retries.
            if (realErrors.Any())
                throw;

            //Take all records that had errors.
            var errors = e.WriteErrors.Select(we => batchArray[we.Index]);
            //Take all unprocessed records.
            var unprocessed = e.UnprocessedRequests
                .Where(ur => ur.ModelType == WriteModelType.InsertOne)
                .OfType<InsertOneModel<BsonDocument>>() 
                .Select(ur => ur.Document);

            var retryBatchArray = errors.Union(unprocessed).ToArray();

            _logger($"Retry {retryBatchArray.Length} records after {delay} ms");

            await Task.Delay(delay);

            await InsertManyWithRetry(collection, retryBatchArray, retries - 1, delay);
        }
    }


  1. Varför får jag en pymongo.cursor.Cursor när jag försöker fråga min mongodb db via pymongo?

  2. Hur man säkerhetskopierar och återställer ClusterControl

  3. Projektion på en MongoDb-fråga med Spring-data och QueryDSL

  4. Mongoose - Få lista med _id istället för en rad objekt med _id