From c2f85b2b220201f3cca32af116038a598f7e9cf0 Mon Sep 17 00:00:00 2001 From: Junwei Zhao Date: Wed, 27 Nov 2019 16:14:54 +1100 Subject: [PATCH] Add knowledge about circuit breaker --- assets/images/circuitbreaker.png | Bin 0 -> 30897 bytes categories/software-design.md | 28 +++++++++++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 assets/images/circuitbreaker.png diff --git a/assets/images/circuitbreaker.png b/assets/images/circuitbreaker.png new file mode 100644 index 0000000000000000000000000000000000000000..e9bc103d0f20e99992c2d0ebfa18648b9f6ec2c0 GIT binary patch literal 30897 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 literal 0 HcmV?d00001 diff --git a/categories/software-design.md b/categories/software-design.md index 23dbe56..b6bb513 100644 --- a/categories/software-design.md +++ b/categories/software-design.md @@ -27,7 +27,7 @@ - Developers must deal with extra complexity of creating a distributed system - Deployment complexity - To deploy different types of services - + ## Service Mesh A service mesh is a way to control how different parts of an application share data with one another. Unlike other systems for managing this communication, a service mesh is a dedicated infrastructure layer built right into an app. This visible infrastructure layer can document how well (or not) different parts of an app interact, so it becomes easier to optimize communication and avoid downtime as an app grows. @@ -37,6 +37,32 @@ A service mesh is a way to control how different parts of an application share d * [Istio](https://istio.io/) * [Consul](https://www.consul.io/) +# CircuitBreaker Design + +## Why we need CircuitBreaker + +In case we have serviceB down, serviceA should still try to recover from this and try to do one of the followings: +- **Custom fallback**: Try to get the same data from some other source. If not possible, use its own cache value. +- **Fail fast**: If serviceA knows that serviceB is down, there is no point waiting for the timeout and consuming its own resources. It should return ASAP “knowing” that serviceB is down +- **Don’t crash**: As we saw in this case, serviceA should not have crashed. +- **Heal automatic**: Periodically check if serviceB is working again. +- **Other APIs should work**: All other APIs should continue to work. + +## What is circuit breaker design? +The idea behind is simple: +- Once serviceA “knows” that serviceB is down, there is no need to make request to serviceB. serviceA should return cached data or timeout error as soon as it can. This is the OPEN state of the circuit +- Once serviceA “knows” that serviceB is up, we can CLOSE the circuit so that request can be made to serviceB again. +- Periodically make fresh calls to serviceB to see if it is successfully returning the result. This state is HALF-OPEN. + +![CircuitBreaker](https://raw.githubusercontent.com/wahyd4/knowledge-mind-mapping/master/assets/images/circuitbreaker.png) + + + +## More links + +- +- + # OOP - Polymorphism