पोली सर्किट ब्रेकर और संभाला अपवाद
मैं सर्किट ब्रेकर पैटर्न को लागू करने के लिए पोली का उपयोग करना चाहता हूं।
डॉक्स में, हाफ ओपन स्टेट का विवरण होता है , और वहां वह कहता है:
- यदि एक संभाला अपवाद प्राप्त होता है, तो वह अपवाद फिर से हटा दिया जाता है, और सर्किट संक्रमण तुरंत वापस खोलने के लिए, और कॉन्फ़िगर किए गए समय के लिए फिर से खुला रहता है।
- यदि एक अखंडित अपवाद प्राप्त होता है, तो सर्किट आधा-खुला रहता है।
मुझे यकीन नहीं है कि मैं यहाँ संभाला और बिना किसी अपवाद के अंतर को समझ सकता हूँ। हम एक ऐसे मामले का वर्णन कर रहे हैं, जहां एक नीति द्वारा चलाया जाता है और एक अपवाद को फेंक रहा है।
जब वे कहते हैं कि अपवाद को संभाला जाता है, तो उनका मतलब कहां है कि इसे संभाला जा रहा है? क्योंकि जैसा कि हमने कहा, कार्रवाई ने इसे फेंक दिया तो इसका मतलब यह नहीं है कि यह अखंडित है?
यह मुझे पूरी तरह से समझ में नहीं आता है कि आधा खुला राज्य आधा खुला रहता है और यह कब खुले में संक्रमण करता है।
जवाब
जब आप एक सर्किट ब्रेकर नीति को परिभाषित करते हैं तो आप परिभाषित कर सकते हैं कि सीबी कार्यान्वयन द्वारा किस प्रकार के अपवादों पर विचार किया जाना चाहिए । दूसरे शब्दों में, आप उन अपवादों को सूचीबद्ध कर सकते हैं जिन्हें असफल निष्पादन के रूप में माना जाना चाहिए और उन्हें लगातार विफलता की गिनती में गिना जाना चाहिए।
आप Handle<T>और Or<T>विधि कॉल के संयोजन के साथ अपवादों की सूची को परिभाषित कर सकते हैं ।
आइए एक सरल उदाहरण के माध्यम से इस अवधारणा की छानबीन करें:
var retry = Policy
.Handle<ArgumentException>()
.Or<NotSupportedException>()
.WaitAndRetry(5, _ => TimeSpan.FromSeconds(1),
onRetry: (exception, delay, context) => Console.WriteLine($"{"Retry",-10}{delay,-10:ss\\.fff}: {exception.GetType().Name}")); var circuitBreaker = Policy .Handle<ArgumentException>() .CircuitBreaker(2, TimeSpan.FromSeconds(1), onBreak: (ex, @break) => Console.WriteLine($"{"Break",-10}{@break,-10:ss\\.fff}: {ex.GetType().Name}"),
onReset: () => Console.WriteLine($"{"Reset",-10}"), onHalfOpen: () => Console.WriteLine($"{"HalfOpen",-10}"));
- सर्किट ब्रेकर नीति सभी
ArgumentExceptionएस (शामिलArgumentNullExceptionऔरArgumentOutOfRangeException) को संभाला अपवाद मानती है।- इसका मतलब यह है कि अगर बुलाया प्रतिनिधि इन तीन अपवादों में से एक को फेंकता है तो यह क्रमिक विफलता की संख्या में वृद्धि करेगा और यदि सीमा तक पहुंच जाता है तो यह टूट जाएगा।
- के मामले में
ArgumentExceptionऔरNotSupportedExceptionसाथ ही मामले में रिट्री पॉलिसी शुरू हो जाती है ।- यदि इनमें से किसी को भी फेंक दिया जाता है तो यह एक सेकंड के लिए सो जाएगा और फिर यह उसी प्रतिनिधि को फिर से निष्पादित करने की कोशिश करता है।
इसलिए, सर्किट ब्रेकर के नजरिए से अगर NotSupportedExceptionइसे फेंका जाए तो इसे नहीं माना जाएगा।
इस प्रकार हमारा नमूना विधि कार्यान्वित किया जाता है जो या तो एक फेंक जाएगा ArgumentExceptionया एक NotSupportedException:
private static int count = 0;
private const int threshold = 3;
static void SampleCall()
{
count++;
if (count >= threshold) throw new NotSupportedException();
throw new ArgumentException("Nothing");
}
नीतियों का उपयोग:
var strategy = Policy.Wrap(retry, circuitBreaker);
try
{
strategy.Execute(SampleCall);
Console.WriteLine("Succeeded");
}
catch (NotSupportedException)
{
Console.WriteLine("Failed");
}
threshold3 पर सेट होने पर आउटपुट
Retry 01.000 : ArgumentException
Break 01.000 : ArgumentException
Retry 01.000 : ArgumentException
HalfOpen
Retry 01.000 : NotSupportedException
Retry 01.000 : NotSupportedException
Retry 01.000 : NotSupportedException
Failed
सीबी के बाद HalfOpenराज्य में खुद को स्थानांतरित कर दिया गया है, तो SampleCallकेवल NotSupportedExceptionएस फेंकता है । यह सीबी द्वारा नियंत्रित नहीं किया गया है, इसलिए यह HalfOpenराज्य में बना हुआ है ।
threshold2 पर सेट होने पर आउटपुट
Retry 01.000 : ArgumentException
Retry 01.000 : NotSupportedException
Retry 01.000 : NotSupportedException
Retry 01.000 : NotSupportedException
Retry 01.000 : NotSupportedException
Failed
सीबी नहीं टूटी क्योंकि लगातार दो नहीं थे ArgumentException। लेकिन रिट्री ने ट्रिगर किया क्योंकि यह भी संभालता है NotSupportedException।
threshold4 पर सेट होने पर आउटपुट
Retry 01.000 : ArgumentException
Break 01.000 : ArgumentException
Retry 01.000 : ArgumentException
HalfOpen
Break 01.000 : ArgumentException
Retry 01.000 : ArgumentException
HalfOpen
Retry 01.000 : NotSupportedException
Retry 01.000 : NotSupportedException
Failed
क्योंकि SampleCallफेंक किया ArgumentExceptionसीबी में था जब HalfOpenराज्य है यही कारण है कि सीबी माना जाता है कि संभाला अपवाद और से खुद को स्थानांतरित कर के रूप में HalfOpenकरने के लिए Open।