What if your app never crashes, even when parts of it fail?
Why Graceful degradation in Microservices? - Purpose & Use Cases
Start learning this pattern below
Jump into concepts and practice - no test required
Imagine a busy online store where every service depends on others. If one service, like the payment system, goes down, the whole site crashes or shows errors everywhere.
Manually handling failures means writing complex code everywhere to check if each service is working. This slows development, causes bugs, and users get frustrated with broken pages or lost orders.
Graceful degradation lets the system keep working by providing simpler features or fallback options when parts fail. Instead of crashing, users still browse or checkout with limited options, keeping the experience smooth.
if paymentService.isAvailable(): processPayment() else: showError()
processPayment() fallbackTo('saveForLater')It enables systems to stay reliable and user-friendly even when some parts fail, improving trust and satisfaction.
When a video streaming service's recommendation engine fails, it still plays videos but skips suggestions, so users keep watching without interruption.
Manual failure handling is complex and fragile.
Graceful degradation provides fallback options to keep services running.
This approach improves user experience and system reliability.
Practice
graceful degradation in microservices?Solution
Step 1: Understand the concept of graceful degradation
Graceful degradation means the system continues to work even if some parts fail, but with limited features.Step 2: Identify the goal in microservices context
In microservices, it ensures users still get responses, possibly simpler or fallback, instead of total failure.Final Answer:
To keep the system running with reduced functionality during failures -> Option CQuick Check:
Graceful degradation = reduced functionality during failure [OK]
- Thinking graceful degradation means full system shutdown
- Confusing graceful degradation with scaling techniques
- Assuming it replaces microservices with monolith
Solution
Step 1: Identify how graceful degradation handles failures
It uses fallback responses or simpler data to keep the system responsive.Step 2: Match the option that uses fallback
Use a fallback response when the called service is unavailable describes using fallback response when a service is down, which is correct.Final Answer:
Use a fallback response when the called service is unavailable -> Option DQuick Check:
Fallback response = graceful degradation [OK]
- Stopping entire request instead of fallback
- Ignoring failure without response
- Restarting cluster is not graceful degradation
response = callService()
if response == null:
response = getCachedData()
return responseWhat will be returned if
callService() fails?Solution
Step 1: Analyze the code flow when callService() fails
If callService() returns null (failure), the code fetches cached data as fallback.Step 2: Determine the returned value
The fallback cached data is returned instead of null or error.Final Answer:
Cached data as fallback -> Option AQuick Check:
Fallback cached data returned on failure [OK]
- Assuming error message is returned
- Thinking null is returned directly
- Confusing empty string with fallback data
try {
data = fetchFromService()
} catch (Exception e) {
data = null
}
return data.toString()What is the main problem with this code?
Solution
Step 1: Understand exception handling and return statement
If fetchFromService() fails, data is set to null, then data.toString() is called.Step 2: Identify the error caused by calling toString() on null
Calling toString() on null causes a runtime NullPointerException or similar error.Final Answer:
It returns null.toString() causing a runtime error -> Option BQuick Check:
Calling toString() on null causes error [OK]
- Ignoring null check before toString()
- Assuming exception is handled fully
- Thinking it retries infinitely
Solution
Step 1: Understand graceful degradation for critical service failure
When payment service fails, system should still respond with limited info, not block or error out.Step 2: Evaluate options for best graceful degradation
Return a simplified confirmation without payment details and log failure for retry returns simplified confirmation and logs failure for retry, maintaining user experience and system reliability.Final Answer:
Return a simplified confirmation without payment details and log failure for retry -> Option AQuick Check:
Simplified response + retry = graceful degradation [OK]
- Blocking entire process on failure
- Sending immediate error without fallback
- Removing critical service entirely
