sql >> Database >  >> NoSQL >> MongoDB

CosmosDb Request rate is groot met insertMany

Mongo-stuurprogramma vertelt u welke records fouten hebben gekregen en welke helemaal niet zijn verwerkt. Als alle fouten (meestal één) code 16500 hebben, dan is uw probleem het beperken en opnieuw proberen van fouten en zijn de resterende records veilig. Anders worden uw fouten door iets anders veroorzaakt en moet u een analyse uitvoeren en beslissen of u door wilt gaan met nieuwe pogingen.

Mongo-stuurprogramma retourneert geen HTTP-header waar Cosmos DB vertraging suggereert voordat het opnieuw wordt geprobeerd, maar dat is geen probleem. Vertraging is sowieso geen garantie voor succes, omdat andere verzoeken die dezelfde database raken, RU's kunnen gebruiken. U kunt beter experimenteren en uw eigen regels voor opnieuw proberen bepalen. Hieronder vindt u een eenvoudige recursieve oplossing die blijft proberen totdat alles in orde is of de limiet voor opnieuw proberen is bereikt.

    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. MongoDB geïnstalleerd via Homebrew werkt niet

  2. Document verwijderen uit mongoDB

  3. Hoe te beslissen welke NoSQL-technologie te gebruiken?

  4. Vermijd de totale limiet van 16 MB