Bird
Raised Fist0
Microservicessystem_design~10 mins

Retry with exponential backoff in Microservices - Interactive Code Practice

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 set the initial retry delay.

Microservices
retryDelay = [1]
Drag options to blanks, or click blank then click option'
A1000 # milliseconds
B5 # attempts
Ctrue # enable retry
D0 # no delay
Attempts:
3 left
💡 Hint
Common Mistakes
Using retry count instead of delay
Setting delay to zero disables backoff
2fill in blank
medium

Complete the code to calculate the next retry delay using exponential backoff.

Microservices
nextDelay = retryDelay * (2 [1] attempt)
Drag options to blanks, or click blank then click option'
A**
B-
C+
D//
Attempts:
3 left
💡 Hint
Common Mistakes
Using addition instead of power
Using integer division instead of power
3fill in blank
hard

Fix the error in the retry condition to stop after max attempts.

Microservices
if attempt [1] maxAttempts:
    stopRetrying()
Drag options to blanks, or click blank then click option'
A<=
B==
C>=
D!=
Attempts:
3 left
💡 Hint
Common Mistakes
Using '<=' which allows too many retries
Using '==' which may miss some cases
4fill in blank
hard

Fill both blanks to implement jitter in the retry delay calculation.

Microservices
import random
jitter = random.[1](0, retryDelay)
nextDelay = retryDelay [2] jitter
Drag options to blanks, or click blank then click option'
Arandint
B+
C-
Drandom
Attempts:
3 left
💡 Hint
Common Mistakes
Using 'random' instead of 'randint'
Subtracting jitter instead of adding
5fill in blank
hard

Fill all three blanks to implement a capped exponential backoff with jitter.

Microservices
maxDelay = 30000
baseDelay = 1000
attempt = 3
rawDelay = baseDelay * (2 [1] attempt)
cappedDelay = min(rawDelay, [2])
jitter = random.[3](0, cappedDelay)
finalDelay = cappedDelay + jitter
Drag options to blanks, or click blank then click option'
A**
BmaxDelay
Crandint
DbaseDelay
Attempts:
3 left
💡 Hint
Common Mistakes
Using '+' instead of '**' for exponent
Using baseDelay instead of maxDelay for cap
Using random instead of randint for jitter

Practice

(1/5)
1. What is the main purpose of using retry with exponential backoff in microservices?
easy
A. To stop retrying after the first failure
B. To immediately retry requests without delay
C. To wait longer between retries after each failure to reduce load
D. To increase the number of retries indefinitely

Solution

  1. Step 1: Understand retry behavior

    Retry with exponential backoff increases wait time after each failure to avoid overwhelming the system.
  2. Step 2: Identify the purpose

    This approach helps reduce load and gives the system time to recover from temporary issues.
  3. Final Answer:

    To wait longer between retries after each failure to reduce load -> Option C
  4. Quick Check:

    Exponential backoff = wait longer after failure [OK]
Hint: Exponential backoff means increasing wait times after failures [OK]
Common Mistakes:
  • Thinking retries happen immediately without delay
  • Assuming retries stop after one failure
  • Believing retries increase without limit
2. Which of the following is the correct formula for calculating the wait time in exponential backoff after the nth retry?
easy
A. wait_time = base_delay * 2^n
B. wait_time = base_delay + n
C. wait_time = base_delay / n
D. wait_time = base_delay * n

Solution

  1. Step 1: Recall exponential backoff formula

    Exponential backoff doubles the wait time after each retry, so wait time grows exponentially.
  2. Step 2: Match formula to options

    The formula is wait_time = base_delay * 2^n, where n is the retry count.
  3. Final Answer:

    wait_time = base_delay * 2^n -> Option A
  4. Quick Check:

    Exponential means power of 2 [OK]
Hint: Exponential backoff doubles wait time each retry (power of 2) [OK]
Common Mistakes:
  • Using linear multiplication instead of exponential
  • Dividing base delay by retry count
  • Adding retry count instead of multiplying
3. Consider this pseudocode for retry with exponential backoff:
max_retries = 3
base_delay = 100
for attempt in range(max_retries):
    success = call_service()
    if success:
        print('Success')
        break
    else:
        wait_time = base_delay * 2 ** attempt
        print(f'Retry after {wait_time} ms')

What will be the printed output if all retries fail?
medium
A. Retry after 100 ms Retry after 200 ms Retry after 400 ms
B. Retry after 100 ms Retry after 300 ms Retry after 600 ms
C. Retry after 100 ms Retry after 100 ms Retry after 100 ms
D. Retry after 200 ms Retry after 400 ms Retry after 800 ms

Solution

  1. Step 1: Calculate wait times per attempt

    For attempt 0: 100 * 2^0 = 100 ms
    For attempt 1: 100 * 2^1 = 200 ms
    For attempt 2: 100 * 2^2 = 400 ms
  2. Step 2: Match calculated times to output

    The printed output matches Retry after 100 ms Retry after 200 ms Retry after 400 ms exactly with increasing wait times.
  3. Final Answer:

    Retry after 100 ms Retry after 200 ms Retry after 400 ms -> Option A
  4. Quick Check:

    Wait times double each retry: 100, 200, 400 [OK]
Hint: Calculate 2^attempt and multiply by base delay [OK]
Common Mistakes:
  • Adding instead of multiplying for wait time
  • Using constant wait time for all retries
  • Starting exponent from 1 instead of 0
4. In this retry logic snippet, what is the main error?
max_retries = 3
base_delay = 100
for attempt in range(max_retries):
    success = call_service()
    if success:
        print('Success')
        break
    else:
        wait_time = base_delay * 2 ** (attempt + 1)
        sleep(wait_time / 1000)
medium
A. The loop should run max_retries + 1 times
B. The base_delay should be divided by 2
C. The sleep time should not be divided by 1000
D. The exponent should be just attempt, not attempt + 1

Solution

  1. Step 1: Analyze exponent usage in wait time

    The formula uses 2^(attempt + 1), which starts doubling from 2^1 on first attempt, skipping 2^0.
  2. Step 2: Identify correct exponent start

    Exponential backoff usually starts with 2^0 for the first retry to avoid unnecessarily long initial wait.
  3. Final Answer:

    The exponent should be just attempt, not attempt + 1 -> Option D
  4. Quick Check:

    Exponent starts at 0 for first retry [OK]
Hint: Exponent starts at 0 for first retry, not 1 [OK]
Common Mistakes:
  • Starting exponent at 1 causing longer initial wait
  • Incorrect sleep time units
  • Wrong loop count for retries
5. You design a microservice that calls an external API. To handle failures, you implement retry with exponential backoff and jitter. Which approach best reduces the risk of retry storms when many instances fail simultaneously?
hard
A. Use a fixed delay between retries without jitter
B. Add random jitter to the exponential backoff delay before each retry
C. Retry immediately without any delay
D. Increase max retries to a very high number

Solution

  1. Step 1: Understand retry storms

    When many instances retry at the same time, they can overload the system, causing a retry storm.
  2. Step 2: Use jitter to spread retries

    Adding random jitter to the exponential backoff delay spreads retry attempts over time, reducing simultaneous retries.
  3. Final Answer:

    Add random jitter to the exponential backoff delay before each retry -> Option B
  4. Quick Check:

    Jitter spreads retries, preventing retry storms [OK]
Hint: Add jitter to backoff delay to avoid synchronized retries [OK]
Common Mistakes:
  • Using fixed delays causing synchronized retries
  • Retrying immediately causing overload
  • Setting too many retries increasing load