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:
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);