Bird
Raised Fist0
Microservicessystem_design~10 mins

Why resilience prevents cascading failures in Microservices - Test Your Understanding

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to add a retry mechanism in a microservice call.

Microservices
response = call_service()
if not response.success:
    response = call_service()[1]
Drag options to blanks, or click blank then click option'
Aretry()
Attempts:
3 left
💡 Hint
Common Mistakes
Not retrying at all
Retrying infinitely without limit
Ignoring the failure
2fill in blank
medium

Complete the code to implement a circuit breaker pattern.

Microservices
if circuit_breaker.[1]():
    return fallback_response()
Drag options to blanks, or click blank then click option'
Atrip
Bclose
Creset
Dis_open
Attempts:
3 left
💡 Hint
Common Mistakes
Using 'close' instead of 'is_open'
Calling reset prematurely
Using 'trip' as a method
3fill in blank
hard

Fix the error in the code that limits concurrent requests to a service.

Microservices
semaphore = Semaphore([1])
with semaphore:
    call_service()
Drag options to blanks, or click blank then click option'
ANone
B'10'
C10
D-1
Attempts:
3 left
💡 Hint
Common Mistakes
Using string '10' instead of integer 10
Using None or negative values
4fill in blank
hard

Fill both blanks to create a timeout wrapper for a service call.

Microservices
try:
    result = call_service(timeout=[1])
except [2]:
    result = fallback()
Drag options to blanks, or click blank then click option'
A5
BTimeoutError
CConnectionError
D10
Attempts:
3 left
💡 Hint
Common Mistakes
Using too high timeout values
Catching wrong exception types
5fill in blank
hard

Fill all three blanks to implement bulkhead isolation in microservices.

Microservices
bulkhead = Bulkhead(max_concurrent_calls=[1], queue_size=[2])
with bulkhead.[3]():
    call_service()
Drag options to blanks, or click blank then click option'
A10
B20
Cacquire
Drelease
Attempts:
3 left
💡 Hint
Common Mistakes
Using 'release' instead of 'acquire'
Setting queue size too low or too high

Practice

(1/5)
1. What is the main reason resilience techniques are used in microservices architectures?
easy
A. To increase the speed of all services regardless of failures
B. To make services use less memory
C. To reduce the number of services in the system
D. To prevent one service failure from causing other services to fail

Solution

  1. Step 1: Understand the purpose of resilience

    Resilience techniques help systems handle failures without spreading the problem to other parts.
  2. Step 2: Identify the effect on cascading failures

    By isolating failures, resilience prevents one failure from causing a chain reaction in other services.
  3. Final Answer:

    To prevent one service failure from causing other services to fail -> Option D
  4. Quick Check:

    Resilience prevents cascading failures = B [OK]
Hint: Resilience stops failure spread, not just speed or size [OK]
Common Mistakes:
  • Thinking resilience only improves speed
  • Confusing resilience with reducing service count
  • Assuming resilience saves memory
2. Which of the following is a correct resilience pattern syntax in a microservice call?
easy
A. callService().retry(1000).timeout(3)
B. callService().retry(3).timeout(1000)
C. callService().timeout(3).retry(1000)
D. callService().retry(0).timeout(0)

Solution

  1. Step 1: Understand retry and timeout order

    Retries specify how many times to try again; timeout is the max wait time in milliseconds.
  2. Step 2: Check option correctness

    callService().retry(3).timeout(1000) uses retry(3) and timeout(1000) correctly. Others mix values or use zero which disables resilience.
  3. Final Answer:

    callService().retry(3).timeout(1000) -> Option B
  4. Quick Check:

    Correct retry and timeout syntax = C [OK]
Hint: Retry count is small integer; timeout is milliseconds [OK]
Common Mistakes:
  • Swapping retry and timeout values
  • Using zero disables resilience
  • Confusing units of timeout
3. Consider this pseudocode snippet for a microservice call with resilience:
response = callService().retry(2).timeout(500).execute()
If the service fails twice quickly and then succeeds on the third try, what will be the outcome?
medium
A. The call succeeds after two retries within timeout
B. The call never retries and returns failure
C. The call times out before any retry
D. The call fails immediately without retries

Solution

  1. Step 1: Analyze retry behavior

    Retry(2) means the system will try up to 3 times total (1 initial + 2 retries) if failures occur.
  2. Step 2: Consider timeout and success timing

    Timeout(500) means each try waits up to 500ms. If the third try succeeds within this time, the call succeeds.
  3. Final Answer:

    The call succeeds after two retries within timeout -> Option A
  4. Quick Check:

    Retries allow success after failures = D [OK]
Hint: Retries add attempts; timeout limits each try duration [OK]
Common Mistakes:
  • Assuming no retries happen
  • Confusing total timeout with per-try timeout
  • Thinking timeout cancels retries immediately
4. A microservice uses a circuit breaker to prevent cascading failures. The circuit breaker is set to open after 5 failures but it opens after only 2 failures. What is the likely cause?
medium
A. The failure count threshold is incorrectly configured
B. The circuit breaker is ignoring failures
C. The service is not failing at all
D. The circuit breaker is disabled

Solution

  1. Step 1: Understand circuit breaker failure threshold

    The circuit breaker opens after a configured number of failures to stop calls temporarily.
  2. Step 2: Analyze early opening

    If it opens after 2 failures instead of 5, the threshold setting is likely wrong or misread.
  3. Final Answer:

    The failure count threshold is incorrectly configured -> Option A
  4. Quick Check:

    Early circuit breaker open = A [OK]
Hint: Check config values when behavior differs from expectations [OK]
Common Mistakes:
  • Assuming circuit breaker ignores failures
  • Thinking service is healthy when breaker opens
  • Believing circuit breaker is disabled if it opens
5. You design a microservices system with multiple dependent services. To prevent cascading failures, which combination of resilience patterns is best to apply?
hard
A. No retries, no timeouts, and no bulkheads
B. Retries with long timeouts and no circuit breakers
C. Circuit breakers, bulkheads, and short timeouts
D. Retries with infinite timeout and no bulkheads

Solution

  1. Step 1: Identify resilience patterns that isolate failures

    Circuit breakers stop calls to failing services; bulkheads isolate failures to parts of the system; short timeouts prevent long waits.
  2. Step 2: Evaluate options for preventing cascading failures

    Circuit breakers, bulkheads, and short timeouts combines these patterns effectively to keep the system stable and responsive.
  3. Final Answer:

    Circuit breakers, bulkheads, and short timeouts -> Option C
  4. Quick Check:

    Best resilience combo isolates and limits failure impact = A [OK]
Hint: Use circuit breakers + bulkheads + short timeouts to isolate failures [OK]
Common Mistakes:
  • Using long or infinite timeouts causing delays
  • Skipping circuit breakers leading to cascading failures
  • Not isolating failures with bulkheads