Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C#

C# में रिट्री लॉजिक कैसे लिखें?

रिट्री लॉजिक तब लागू किया जाता है जब कोई ऑपरेशन विफल होता है। इसे केवल वहीं लागू करें जहां विफल ऑपरेशन का पूरा संदर्भ उपलब्ध हो।

महत्वपूर्ण सिद्धांत

  • सभी कनेक्टिविटी विफलताओं को लॉग करें जो रिट्री का कारण बनती हैं
  • अंतर्निहित समस्याओं (एप्लिकेशन, सेवाएँ, रिसोर्सेज) की पहचान के लिए लॉगिंग आवश्यक
  • एक्सपोनेंशियल बैकऑफ का उपयोग करें (फिक्स्ड डिले के बजाय)
  • अधिकतम रिट्री अटेम्प्ट्स सेट करें
  • रीट्राएबल एक्सेप्शन्स को पहचानें (नेटवर्क एरर, टाइमआउट, 5xx HTTP स्टेटस)

बेसिक रिट्री हेल्पर (दिए गए उदाहरण से)

public static class RetryHelper {
    public static void Retry(int times, TimeSpan delay, Action operation) {
        var attempts = 0;
        do {
            try {
                attempts++;
                System.Console.WriteLine($"Attempt: {attempts}");
                operation();
                break;  // सफलता पर लूप छोड़ें
            }
            catch (Exception ex) {
                if (attempts == times)
                    throw;  // अंतिम अटेम्प्ट पर एक्सेप्शन रीथ्रो
                
                Task.Delay(delay).Wait();  // डिले (ब्लॉकिंग)
            }
        } while (true);
    }
}

// उपयोग
class Program {
    public static void Main() {
        HttpClient client = new HttpClient();
        dynamic res = null;
        var retryAttempts = 3;
        var delay = TimeSpan.FromSeconds(2);
        
        RetryHelper.Retry(retryAttempts, delay, () => {
            res = client.GetAsync("https://example.com/api/cycles/1");
        });
        
        Console.ReadLine();
    }
}

सुधारित संस्करण: Async/Await और Exponential Backoff के साथ

public static class RetryHelper {
    public static async Task<T> RetryAsync<T>(
        Func<Task<T>> operation,
        int maxAttempts = 3,
        TimeSpan? baseDelay = null,
        Func<Exception, bool> retryPredicate = null) 
    {
        var delay = baseDelay ?? TimeSpan.FromSeconds(1);
        var attempt = 0;
        
        while (true) {
            try {
                attempt++;
                return await operation();
            }
            catch (Exception ex) when (attempt < maxAttempts && 
                  (retryPredicate?.Invoke(ex) ?? IsTransient(ex))) {
                Console.WriteLine($"Attempt {attempt} failed: {ex.Message}. Retrying in {delay}...");
                await Task.Delay(delay);
                delay = TimeSpan.FromSeconds(delay.TotalSeconds * 2); // Exponential backoff
            }
        }
    }
    
    private static bool IsTransient(Exception ex) {
        return ex is HttpRequestException 
            || ex is TimeoutException
            || ex is TaskCanceledException;
    }
}

// उपयोग
var result = await RetryHelper.RetryAsync(async () => {
    var response = await httpClient.GetAsync(url);
    response.EnsureSuccessStatusCode();
    return await response.Content.ReadAsStringAsync();
}, maxAttempts: 5);

Polly लाइब्रेरी (प्रोडक्शन के लिए अनुशंसित)

// NuGet: Polly
var policy = Policy
    .Handle<HttpRequestException>()
    .Or<TimeoutException>()
    .WaitAndRetryAsync(
        retryCount: 3,
        sleepDurationProvider: attempt => TimeSpan.FromSeconds(Math.Pow(2, attempt)),
        onRetry: (exception, delay) => {
            Console.WriteLine($"Retry in {delay}: {exception.Message}");
        });

var result = await policy.ExecuteAsync(async () => {
    return await httpClient.GetStringAsync(url);
});

मुख्य विचार

  • इडेम्पोटेंसी: ऑपरेशन इडेम्पोटेंट होना चाहिए (GET सुरक्षित, POST सावधानी से)
  • सर्किट ब्रेकर: बार-बार विफलता पर कॉल्स रोकें
  • जिटर: डिले में रैंडमनेस जोड़ें (थंडरिंग हर्ड रोकने के लिए)
  • कैंसिलेशन: CancellationToken समर्थन जोड़ें
  • टेलीमेट्री: मेट्रिक्स रिकॉर्ड करें (अटेम्प्ट्स, डिले, सक्सेस रेट)
  1. Swift 3 से ऐप्स कैसे लिखें Swift 3 से ऐप्स कैसे लिखें

    Swift का उपयोग macOS और iOS डिवाइस के लिए ऐप्स लिखने या बनाने के लिए किया जाता है। एप्पल ने डिवाइस से सबसे तेज़ और सबसे कुशल प्रदर्शन प्राप्त करने के लिए स्पष्ट रूप से Swift को डिज़ाइन किया, और Swift 3 इसके पहले से ही प्रभावशाली फीचर सेट पर विस्तार करता है। Swift 4 में क्या नया है? Swift को सिर्फ

  1. लिनक्स में विंडोज पार्टीशन पर लिखने का तरीका लिनक्स में विंडोज पार्टीशन पर लिखने का तरीका

    यदि आप विंडोज और लिनक्स को डुअल-बूट कर रहे हैं, तो आपने देखा होगा कि जब आप लिनक्स से NTFS पार्टीशन माउंट करते हैं, तो कभी-कभी आप उस पर लिख नहीं सकते। आप वहां जो कुछ भी है उसे पढ़ सकते हैं, लेकिन आप फाइलों को डिलीट, रीनेम, संशोधित या नई फाइलें और डायरेक्टरी नहीं लिख सकते। मैं लिनक्स से अपने विंडोज पा

  1. - बैश लूप में महारत: कुशल फ़ाइल प्रोसेसिंग के लिए चरण-दर-चरण मार्गदर्शिका

    लोग यूनिक्स शेल सीखना चाहते हैं इसका एक सामान्य कारण बैच प्रोसेसिंग की शक्ति को अनलॉक करना है। यदि आप कई फाइलों पर क्रियाओं का कुछ सेट करना चाहते हैं, तो ऐसा करने का एक तरीका उन फाइलों पर पुनरावृति करने वाली कमांड का निर्माण करना है। प्रोग्रामिंग शब्दावली में, इसे एग्जीक्यूशन कंट्रोल कहा जाता है, और