2015-06-26 5 views
5

मैं थ्रॉटल डॉक्यूमेंट डीबी क्लाइंट कॉल्स के लिए बहुत वर्बोज़ रीट्री लॉजिक लिख रहा हूं।डॉक्यूमेंटडीबी ट्रांजिएंटफॉल्ट हैंडलिंग बेस्ट प्रैक्टिस

नीचे दिए गए उदाहरण 10 पुनः प्रयासों के साथ इसका एक आम उदाहरण है।

मेरा प्रश्न दो गुना है: क्या यह सबसे अच्छा अभ्यास है, और क्या इसे संभालने के लिए कम वर्बोज़ तरीका है? मुझे लगता है कि माइक्रोसॉफ्ट.एज़ुर.डॉर्ड्स.क्लिएंट। ट्रांसिएंटफॉल्ट हैंडलिंग न्यूजेट पैकेज जो कम कोड के साथ एक ही परिणाम प्राप्त करने वाला है, लेकिन मुझे स्टैक ओवरफ्लो या Google पर कोई उदाहरण नहीं मिल रहा है और ऐसा कोई स्पष्ट प्रतीत नहीं होता है माइक्रोसॉफ्ट से उपलब्ध दस्तावेज।

int maxRetryAttempts = 10; 

while (maxRetryAttempts > 0) 
{ 
    try 
    { 
     // Attempt to call DocumentDB Method 
     // ---[DocumentDB Method Here]--- 
    } 
    catch (DocumentClientException de) 
    { 
     if (de.StatusCode.HasValue) 
     { 
      var statusCode = (int)de.StatusCode; 

      if (statusCode == 429 || statusCode == 503) 
      { 
       //Sleep for retry amount 
       Thread.Sleep(de.RetryAfter); 

       //Decrement max retry attempts 
       maxRetryAttempts--; 
      } 

     } 
    } 
    catch (AggregateException ae) 
    {      
     foreach (Exception ex in ae.InnerExceptions) 
     { 
      if (ex is DocumentClientException) 
      { 
       var documentClientException = ex as DocumentClientException; 
       var statusCode = (int)documentClientException.StatusCode; 
       if (statusCode == 429 || statusCode == 503) 
       { 
        //Sleep for retry amount 
        Thread.Sleep(documentClientException.RetryAfter); 

        //Decrement max retry attempts 
        maxRetryAttempts--; 
       } 
       else 
       { 
        throw; 
       } 
      } 
     } 
    } 
} 

if (maxRetryAttempts < 0) 
{ 
    //Max retry attempts reached 
} 
+0

में आपका 'कैच' ब्लॉक, 'एग्रीगेट एक्सेप्शन' को अनचाहे करते समय, आप चुपचाप सभी गैर-'दस्तावेज़ क्लाइंट अपवाद' अपवादों को त्याग देते हैं। क्या यह जानबूझकर है? मैं अज्ञात अपवादों को बुलबुला करने की उम्मीद करता। –

उत्तर

7

आप DocumentDB डाटा माइग्रेशन उपकरण के लिए Github रेपो में TransientFaultHandling Nuget पैकेज का उपयोग नमूना कोड पा सकते हैं:

https://github.com/Azure/azure-documentdb-datamigrationtool/blob/master/DocumentDb/Microsoft.DataTransfer.DocumentDb.FunctionalTests/DocumentDbHelper.cs

कौन इस तरह दिखता है:

private static IReliableReadWriteDocumentClient CreateClient(IDocumentDbConnectionSettings connectionSettings) 
{ 
    return new DocumentClient(new Uri(connectionSettings.AccountEndpoint), connectionSettings.AccountKey) 
     .AsReliable(new FixedInterval(10, TimeSpan.FromSeconds(1))); 
} 
+2

धन्यवाद एंड्रयू। यह वही था जो मुझे चाहिए था। क्या सफल कॉल किए जाने के बाद हुई रिट्रीज़ की राशि वापस पाने का कोई तरीका है? मैं देखता हूं कि मैं आरयू राशि का उपयोग करता हूं, साथ ही साथ कुछ अन्य जानकारी भी प्राप्त करता हूं, लेकिन यह जानकर कि कितने प्रयास प्रयासों की आवश्यकता है, मुझे मेरी कॉल को ट्यून करने में मदद मिलेगी। – CodeAbundance

+0

सुंदर। विश्वसनीय और "अविश्वसनीय" ग्राहकों के बराबर होने के बावजूद अब अक्षय कोडबेस है। जब तक आप 'गतिशील', एलओएल का उपयोग न करें। – abatishchev

संबंधित मुद्दे