From f2753b9460686a02067880f54e8bb081be91f45f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Fri, 24 May 2024 19:20:14 +0300 Subject: [PATCH] docs: update circuit breaker --- circuit-breaker/README.md | 318 ++++++------------------- circuit-breaker/etc/ServiceDiagram.png | Bin 23591 -> 0 bytes circuit-breaker/etc/StateDiagram.png | Bin 19396 -> 0 bytes 3 files changed, 68 insertions(+), 250 deletions(-) delete mode 100644 circuit-breaker/etc/ServiceDiagram.png delete mode 100644 circuit-breaker/etc/StateDiagram.png diff --git a/circuit-breaker/README.md b/circuit-breaker/README.md index 3ce21a138..595030780 100644 --- a/circuit-breaker/README.md +++ b/circuit-breaker/README.md @@ -6,21 +6,22 @@ tag: - Cloud distributed - Fault tolerance - Microservices + - Retry --- ## Also known as -* Fault tolerance switch +* Fault Tolerance Switch ## Intent -The Circuit Breaker pattern aims to prevent a software system from making calls to a part of the system that is either failing or showing signs of distress. It is a way to gracefully degrade functionality when a dependent service is not responding, rather than failing completely. +To prevent a system from repeatedly trying to execute an operation likely to fail, allowing it to recover from faults and prevent cascading failures. ## Explanation -Real world example +Real-world example -> Imagine a web application that has both local files/images and remote services that are used for fetching data. These remote services may be either healthy and responsive at times, or may become slow and unresponsive at some point of time due to variety of reasons. So if one of the remote services is slow or not responding successfully, our application will try to fetch response from the remote service using multiple threads/processes, soon all of them will hang (also called[thread starvation](https://en.wikipedia.org/wiki/Starvation_(computer_science))) causing our entire web application to crash. We should be able to detect this situation and show the user an appropriate message so that he/she can explore other parts of the app unaffected by the remote serv'ice failure. Meanwhile, the other services that are working normally, should keep functioning unaffected by this failure. +> Consider a real-world example of an e-commerce website that depends on multiple external payment gateways to process transactions. If one of the payment gateways becomes unresponsive or slow, the Circuit Breaker pattern can be used to detect the failure and prevent the system from repeatedly attempting to use the problematic gateway. Instead, it can quickly switch to alternative payment gateways or display an error message to the user, ensuring that the rest of the website remains functional and responsive. This avoids resource exhaustion and provides a better user experience by allowing transactions to be processed through other available services. In plain words @@ -32,265 +33,82 @@ Wikipedia says ## Programmatic Example -So, how does this all come together? With the above example in mind we will imitate the functionality in a simple example. A monitoring service mimics the web app and makes both local and remote calls. +Imagine a web application that uses both local files/images and remote services to fetch data. Remote services can become slow or unresponsive, which may cause the application to hang due to thread starvation. The Circuit Breaker pattern can help detect such failures and allow the application to degrade gracefully. -The service architecture is as follows: - -![alt text](./etc/ServiceDiagram.png "Service Diagram") - -In terms of code, the end user application is: +1. **Simulating a Delayed Remote Service** ```java - -@Slf4j -public class App { - - private static final Logger LOGGER = LoggerFactory.getLogger(App.class); - - /** - * Program entry point. - * - * @param args command line args - */ - public static void main(String[] args) { - - var serverStartTime = System.nanoTime(); - - var delayedService = new DelayedRemoteService(serverStartTime, 5); - var delayedServiceCircuitBreaker = new DefaultCircuitBreaker(delayedService, 3000, 2, - 2000 * 1000 * 1000); - - var quickService = new QuickRemoteService(); - var quickServiceCircuitBreaker = new DefaultCircuitBreaker(quickService, 3000, 2, - 2000 * 1000 * 1000); - - //Create an object of monitoring service which makes both local and remote calls - var monitoringService = new MonitoringService(delayedServiceCircuitBreaker, - quickServiceCircuitBreaker); - - //Fetch response from local resource - LOGGER.info(monitoringService.localResourceResponse()); - - //Fetch response from delayed service 2 times, to meet the failure threshold - LOGGER.info(monitoringService.delayedServiceResponse()); - LOGGER.info(monitoringService.delayedServiceResponse()); - - //Fetch current state of delayed service circuit breaker after crossing failure threshold limit - //which is OPEN now - LOGGER.info(delayedServiceCircuitBreaker.getState()); - - //Meanwhile, the delayed service is down, fetch response from the healthy quick service - LOGGER.info(monitoringService.quickServiceResponse()); - LOGGER.info(quickServiceCircuitBreaker.getState()); - - //Wait for the delayed service to become responsive - try { - LOGGER.info("Waiting for delayed service to become responsive"); - Thread.sleep(5000); - } catch (InterruptedException e) { - LOGGER.error("An error occurred: ", e); - } - //Check the state of delayed circuit breaker, should be HALF_OPEN - LOGGER.info(delayedServiceCircuitBreaker.getState()); - - //Fetch response from delayed service, which should be healthy by now - LOGGER.info(monitoringService.delayedServiceResponse()); - //As successful response is fetched, it should be CLOSED again. - LOGGER.info(delayedServiceCircuitBreaker.getState()); - } -} +// The DelayedRemoteService simulates a remote service that responds after a certain delay. +var delayedService = new DelayedRemoteService(serverStartTime, 5); ``` -The monitoring service: +2. **Setting Up the Circuit Breaker** ```java -public class MonitoringService { - - private final CircuitBreaker delayedService; - - private final CircuitBreaker quickService; - - public MonitoringService(CircuitBreaker delayedService, CircuitBreaker quickService) { - this.delayedService = delayedService; - this.quickService = quickService; - } - - //Assumption: Local service won't fail, no need to wrap it in a circuit breaker logic - public String localResourceResponse() { - return "Local Service is working"; - } - - /** - * Fetch response from the delayed service (with some simulated startup time). - * - * @return response string - */ - public String delayedServiceResponse() { - try { - return this.delayedService.attemptRequest(); - } catch (RemoteServiceException e) { - return e.getMessage(); - } - } - - /** - * Fetches response from a healthy service without any failure. - * - * @return response string - */ - public String quickServiceResponse() { - try { - return this.quickService.attemptRequest(); - } catch (RemoteServiceException e) { - return e.getMessage(); - } - } -} +// The DefaultCircuitBreaker wraps the remote service and monitors for failures. +var delayedServiceCircuitBreaker = new DefaultCircuitBreaker(delayedService, 3000, 2, 2000 * 1000 * 1000); ``` -As it can be seen, it does the call to get local resources directly, but it wraps the call to remote (costly) service in a circuit breaker object, which prevents faults as follows: +3. **Monitoring Service to Handle Requests** ```java -public class DefaultCircuitBreaker implements CircuitBreaker { +// The MonitoringService is responsible for calling the remote services. +var monitoringService = new MonitoringService(delayedServiceCircuitBreaker, quickServiceCircuitBreaker); - private final long timeout; - private final long retryTimePeriod; - private final RemoteService service; - long lastFailureTime; - private String lastFailureResponse; - int failureCount; - private final int failureThreshold; - private State state; - // Future time offset, in nanoseconds - private final long futureTime = 1_000_000_000_000L; +// Fetch response from local resource +LOGGER.info(monitoringService.localResourceResponse()); - /** - * Constructor to create an instance of Circuit Breaker. - * - * @param timeout Timeout for the API request. Not necessary for this simple example - * @param failureThreshold Number of failures we receive from the depended service before changing - * state to 'OPEN' - * @param retryTimePeriod Time period after which a new request is made to remote service for - * status check. - */ - DefaultCircuitBreaker(RemoteService serviceToCall, long timeout, int failureThreshold, - long retryTimePeriod) { - this.service = serviceToCall; - // We start in a closed state hoping that everything is fine - this.state = State.CLOSED; - this.failureThreshold = failureThreshold; - // Timeout for the API request. - // Used to break the calls made to remote resource if it exceeds the limit - this.timeout = timeout; - this.retryTimePeriod = retryTimePeriod; - //An absurd amount of time in future which basically indicates the last failure never happened - this.lastFailureTime = System.nanoTime() + futureTime; - this.failureCount = 0; - } - - // Reset everything to defaults - @Override - public void recordSuccess() { - this.failureCount = 0; - this.lastFailureTime = System.nanoTime() + futureTime; - this.state = State.CLOSED; - } - - @Override - public void recordFailure(String response) { - failureCount = failureCount + 1; - this.lastFailureTime = System.nanoTime(); - // Cache the failure response for returning on open state - this.lastFailureResponse = response; - } - - // Evaluate the current state based on failureThreshold, failureCount and lastFailureTime. - protected void evaluateState() { - if (failureCount >= failureThreshold) { //Then something is wrong with remote service - if ((System.nanoTime() - lastFailureTime) > retryTimePeriod) { - //We have waited long enough and should try checking if service is up - state = State.HALF_OPEN; - } else { - //Service would still probably be down - state = State.OPEN; - } - } else { - //Everything is working fine - state = State.CLOSED; - } - } - - @Override - public String getState() { - evaluateState(); - return state.name(); - } - - /** - * Break the circuit beforehand if it is known service is down Or connect the circuit manually if - * service comes online before expected. - * - * @param state State at which circuit is in - */ - @Override - public void setState(State state) { - this.state = state; - switch (state) { - case OPEN -> { - this.failureCount = failureThreshold; - this.lastFailureTime = System.nanoTime(); - } - case HALF_OPEN -> { - this.failureCount = failureThreshold; - this.lastFailureTime = System.nanoTime() - retryTimePeriod; - } - default -> this.failureCount = 0; - } - } - - /** - * Executes service call. - * - * @return Value from the remote resource, stale response or a custom exception - */ - @Override - public String attemptRequest() throws RemoteServiceException { - evaluateState(); - if (state == State.OPEN) { - // return cached response if the circuit is in OPEN state - return this.lastFailureResponse; - } else { - // Make the API request if the circuit is not OPEN - try { - //In a real application, this would be run in a thread and the timeout - //parameter of the circuit breaker would be utilized to know if service - //is working. Here, we simulate that based on server response itself - var response = service.call(); - // Yay!! the API responded fine. Let's reset everything. - recordSuccess(); - return response; - } catch (RemoteServiceException ex) { - recordFailure(ex.getMessage()); - throw ex; - } - } - } -} +// Fetch response from delayed service 2 times to meet the failure threshold +LOGGER.info(monitoringService.delayedServiceResponse()); +LOGGER.info(monitoringService.delayedServiceResponse()); ``` -How does the above pattern prevent failures? Let's understand via this finite state machine implemented by it. +4. **Handling Circuit Breaker States** -![alt text](./etc/StateDiagram.png "State Diagram") +```java +// Fetch current state of delayed service circuit breaker after crossing failure threshold limit +LOGGER.info(delayedServiceCircuitBreaker.getState()); // Should be OPEN -- We initialize the Circuit Breaker object with certain parameters: `timeout`, `failureThreshold` and `retryTimePeriod`which help determine how resilient the API is. -- Initially, we are in the `closed` state and nos remote calls to the API have occurred. -- Every time the call succeeds, we reset the state to as it was in the beginning. -- If the number of failures cross a certain threshold, we move to the `open` state, which acts just like an open circuit and prevents remote service calls from being made, thus saving resources. (Here, we return the response called ```stale response from API```) -- Once we exceed the retry timeout period, we move to the `half-open` state and make another call to the remote service again to check if the service is working so that we can serve fresh content. A failure sets it back to `open` state and another attempt is made after retry timeout period, while a success sets it to `closed` state so that everything starts working normally again. +// Meanwhile, the delayed service is down, fetch response from the healthy quick service +LOGGER.info(monitoringService.quickServiceResponse()); +LOGGER.info(quickServiceCircuitBreaker.getState()); +``` + +5. **Recovering from Failure** + +```java +// Wait for the delayed service to become responsive +try { + LOGGER.info("Waiting for delayed service to become responsive"); + Thread.sleep(5000); +} catch (InterruptedException e) { + LOGGER.error("An error occurred: ", e); +} + +// Check the state of delayed circuit breaker, should be HALF_OPEN +LOGGER.info(delayedServiceCircuitBreaker.getState()); + +// Fetch response from delayed service, which should be healthy by now +LOGGER.info(monitoringService.delayedServiceResponse()); + +// As successful response is fetched, it should be CLOSED again. +LOGGER.info(delayedServiceCircuitBreaker.getState()); +``` + +Summary of the example + +- Initialize the Circuit Breaker with parameters: `timeout`, `failureThreshold`, and `retryTimePeriod`. +- Start in the `closed` state. +- On successful calls, reset the state. +- On failures exceeding the threshold, transition to the `open` state to prevent further calls. +- After the retry timeout, transition to the `half-open` state to test the service. +- On success in `half-open` state, transition back to `closed`. On failure, return to `open`. + +This example demonstrates how the Circuit Breaker pattern can help maintain application stability and resilience by managing remote service failures. ## Class diagram -![alt text](./etc/circuit-breaker.urm.png "Circuit Breaker class diagram") +![Circuit Breaker](./etc/circuit-breaker.urm.png "Circuit Breaker class diagram") ## Applicability @@ -322,15 +140,15 @@ Trade-Offs: ## Related Patterns +- Bulkhead: Can be used to isolate different parts of the system to prevent failures from spreading across the system - [Retry Pattern](https://github.com/iluwatar/java-design-patterns/tree/master/retry): Can be used in conjunction with the Circuit Breaker pattern to retry failed operations before opening the circuit -- [Bulkhead Pattern](https://learn.microsoft.com/en-us/azure/architecture/patterns/bulkhead): Can be used to isolate different parts of the system to prevent failures from spreading across the system ## Credits -* [Understanding Circuit Breaker Pattern](https://itnext.io/understand-circuitbreaker-design-pattern-with-simple-practical-example-92a752615b42) -* [Martin Fowler on Circuit Breaker](https://martinfowler.com/bliki/CircuitBreaker.html) -* [Fault tolerance in a high volume, distributed system](https://medium.com/netflix-techblog/fault-tolerance-in-a-high-volume-distributed-system-91ab4faae74a) -* [Circuit Breaker pattern](https://docs.microsoft.com/en-us/azure/architecture/patterns/circuit-breaker) -* [Release It! Design and Deploy Production-Ready Software](https://amzn.to/4aqTNEP) -* [Microservices Patterns: With examples in Java](https://amzn.to/3xaZwk0) * [Building Microservices: Designing Fine-Grained Systems](https://amzn.to/43Dx86g) +* [Microservices Patterns: With examples in Java](https://amzn.to/3xaZwk0) +* [Release It! Design and Deploy Production-Ready Software](https://amzn.to/4aqTNEP) +* [Understand CircuitBreaker Design Pattern with Simple Practical Example (ITNEXT)](https://itnext.io/understand-circuitbreaker-design-pattern-with-simple-practical-example-92a752615b42) +* [Circuit Breaker (Martin Fowler)](https://martinfowler.com/bliki/CircuitBreaker.html) +* [Fault tolerance in a high volume, distributed system (Netflix)](https://medium.com/netflix-techblog/fault-tolerance-in-a-high-volume-distributed-system-91ab4faae74a) +* [Circuit Breaker pattern (Microsoft)](https://docs.microsoft.com/en-us/azure/architecture/patterns/circuit-breaker) diff --git a/circuit-breaker/etc/ServiceDiagram.png b/circuit-breaker/etc/ServiceDiagram.png deleted file mode 100644 index 885320a4d9014d18f071638d7075e6987c463fd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23591 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