Circuit Breaker: Implementacja za pomocą Polly

W poprzednim poście wyjaśniłem na czym polega działanie wzorca i kiedy z niego korzystać. Dzisiaj przyszedł czas na implementację. Nie będziemy jednak pisać wszystkiego od początku, ponieważ jest to dość skomplikowane i prawidłowa implementacja zajęłaby sporo czasu. Kilka postów wcześniej, pisałem o Polly, jako mechanizmie do powtarzania nieudanych operacji. Zachęcam do przeczytania tego wpisu przed dalszą lekturą. Dla przypomnienia tytko, wkleję najprostszy przykład:

class Program { static void Main(string[] args) { var policy = Polly.Policy.Handle<DivideByZeroException>().Retry(); policy.Execute(DoSomething); Console.ReadLine(); } public static void DoSomething() { Console.WriteLine("Do something"); throw new DivideByZeroException(); } }

Dzięki Polly,  w analogiczny sposób możemy skonfigurować nasz “obwód”.:

Policy policy = Policy.Handle<Exception>(). CircuitBreaker(3, TimeSpan.FromMinutes(1));

Pierwszy parametr to liczba dopuszczalnych niepowodzeń, a drugi to na ile czasu obwód zostanie otwarty. Całość naszego eksperymentu może wyglądać następująco:

class Program { static void Main(string[] args) { Policy policy = Policy.Handle<Exception>(). CircuitBreaker(3, TimeSpan.FromMinutes(1)); Run(policy); Run(policy); Run(policy); Run(policy); Console.ReadLine(); } private static void Run(Policy policy) { try { policy.Execute(() => DoSomething()); } catch (TimeoutException e) { Console.WriteLine("Nieudana proba."); } } public static void DoSomething() { Console.WriteLine("Test"); throw new TimeoutException(); } }

Uruchamiamy metodę 4 razy, zatem za czwartym dostaniemy wyjątek:

image

Wystarczy, że odczekamy minutę przed czwartym wywołaniem i jak spodziewamy się, obwód pozostanie zamknięty. Kod:

Policy policy = Policy.Handle<Exception>(). CircuitBreaker(3, TimeSpan.FromMinutes(1)); Run(policy); Run(policy); Run(policy); Thread.Sleep(TimeSpan.FromMinutes(1)); Run(policy);

image

Leave a Reply

Your email address will not be published.