sql >> Database teknologi >  >> NoSQL >> MongoDB

CosmosDb Request rate er stor med insertMany

Mongo-driver fortæller dig, hvilke poster der fik fejl, og hvilke der slet ikke blev behandlet. Hvis alle fejl (normalt én) har kode 16500, så er dit problem at drosle og prøve igen på fejl, og de resterende poster er sikre. Ellers er dine fejl forårsaget af noget andet, og du bør analysere og beslutte, om du vil fortsætte med genforsøg.

Mongo-driveren returnerer ikke HTTP-header, hvor Cosmos DB foreslår forsinkelse før genforsøg, men det er ikke en stor sag. Forsinkelse garanterer alligevel ikke succes, fordi andre forespørgsler, der rammer samme database, kan opbruge jernbanevirksomheder. Du er bedre stillet til at eksperimentere og bestemme dine egne regler for genforsøg. Nedenfor er en simpel rekursiv løsning, der bliver ved med at prøve igen, indtil alt er i orden, eller prøvegrænsen er nået.

    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. Hvorfor tillader MongoDB ikke længere brug af $set og $unset med et tomt dokument?

  2. Forår Custom Query med sidebar

  3. Node Mongo Native - hvordan kan man se, når en markør er udtømt?

  4. MONGODB [DEBUG] cursor.refresh() for cursor 7078636577051629992