MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

CosmosDb अनुरोध दर डालने के साथ बड़ी हैकई

मोंगो ड्राइवर आपको बताता है कि कौन से रिकॉर्ड में त्रुटियां हैं और जिन्हें बिल्कुल भी संसाधित नहीं किया गया था। यदि सभी त्रुटियों (आमतौर पर एक) में कोड 16500 है, तो आपकी समस्या थ्रॉटलिंग है और त्रुटियों पर पुनः प्रयास करें और शेष रिकॉर्ड सुरक्षित हैं। अन्यथा आपकी त्रुटियां किसी और चीज के कारण होती हैं और आपको विश्लेषण करना चाहिए और निर्णय लेना चाहिए कि पुनर्प्रयास जारी रखना है या नहीं।

मोंगो ड्राइवर HTTP हेडर वापस नहीं करता है जहां कॉसमॉस डीबी पुनः प्रयास करने से पहले देरी का सुझाव देता है, लेकिन यह कोई बड़ी बात नहीं है। विलंब वैसे भी सफलता की गारंटी नहीं देता है, क्योंकि समान डेटाबेस को हिट करने वाले अन्य अनुरोध RU का उपयोग कर सकते हैं। आप अपने स्वयं के पुनः प्रयास नियमों का प्रयोग और निर्धारण करने से बेहतर हैं। नीचे सरल पुनरावर्ती समाधान दिया गया है जो तब तक पुन:प्रयास करता रहता है जब तक कि सब कुछ ठीक न हो जाए या पुनः प्रयास की सीमा पूरी न हो जाए।

    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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB Yaml कॉन्फ़िग फ़ाइल अपरिचित विकल्प:संग्रहण

  2. डॉट नोटेशन बनाम $elemMatch

  3. उल्का में समग्र कार्य का उपयोग कैसे करें

  4. कैसे एक एम्बेडेड सरणी में एक अद्यतन के बाद नया मान वापस पाने के लिए?

  5. डोकर-लिखें और mongoDB:किसी भी संगतता संस्करण के तहत WiredTiger प्रारंभ करने में विफल?