Retry and failure handling in Rest API - Time & Space Complexity
When working with retry and failure handling in REST APIs, it is important to understand how the time taken grows as retries increase.
We want to know how retry attempts affect the total execution time.
Analyze the time complexity of the following retry logic.
max_retries = 3
for attempt in range(max_retries):
response = send_request()
if response.success:
break
This code tries to send a request up to a maximum number of retries until it succeeds.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Sending the request (send_request function)
- How many times: Up to
max_retriestimes, depending on success
The number of attempts grows linearly with the maximum retries allowed.
| Input Size (max_retries) | Approx. Operations (send_request calls) |
|---|---|
| 1 | 1 |
| 3 | Up to 3 |
| 10 | Up to 10 |
Pattern observation: The total operations increase directly with the number of retries allowed.
Time Complexity: O(n)
This means the time grows linearly with the number of retry attempts allowed.
[X] Wrong: "Retries happen instantly and do not add to total time."
[OK] Correct: Each retry involves waiting for a response, so total time adds up with each attempt.
Understanding how retries affect time helps you design efficient and reliable APIs, a skill valued in real-world projects.
"What if we added exponential backoff delays between retries? How would the time complexity change?"
Practice
What is the main purpose of retry and failure handling in REST API calls?
Solution
Step 1: Understand retry purpose
Retry means trying the same request again if it fails, to handle temporary issues.Step 2: Compare options
Only To automatically try the request again if it fails describes retry correctly. Others describe wrong or harmful behaviors.Final Answer:
To automatically try the request again if it fails -> Option CQuick Check:
Retry = try again [OK]
- Thinking retry speeds up response
- Ignoring errors without handling
- Stopping app immediately on failure
Which of the following is the correct way to set a maximum retry count in a REST API client configuration?
retry_config = {'max_retries': ?}
Solution
Step 1: Identify correct key name
The standard key for retry count is 'max_retries' with underscore.Step 2: Check option values
'max_retries': 5 uses correct key and value format. Others use wrong keys or casing.Final Answer:
'max_retries': 5 -> Option BQuick Check:
Correct key is max_retries [OK]
- Using camelCase instead of snake_case
- Misspelling the key as max_retry
- Using hyphens in keys
Consider this Python code snippet for retrying a REST API call:
import time
def call_api():
for attempt in range(3):
response = make_request()
if response.status_code == 200:
return 'Success'
time.sleep(1)
return 'Failed'What will be the output if all three requests fail with status code 500?
Solution
Step 1: Analyze retry loop behavior
The loop tries 3 times. If status_code is 200, returns 'Success'. Otherwise, waits 1 second and retries.Step 2: Check failure case
All attempts return 500, so loop finishes without returning 'Success'. Then returns 'Failed'.Final Answer:
"Failed" -> Option DQuick Check:
All fail -> return 'Failed' [OK]
- Assuming success on failure status
- Expecting infinite loop
- Thinking exception is raised automatically
Find the error in this retry logic snippet:
def fetch_data():
retries = 3
while retries > 0:
response = api_call()
if response.status_code == 200:
return response.data
retries -= 1
return None
retries -= 1Solution
Step 1: Review code flow
The last line retries -= 1 is after return None, so it never runs.Step 2: Identify unreachable code problem
Code after return is unreachable and unnecessary, indicating a logic error.Final Answer:
The last line decreases retries after return, unreachable code -> Option AQuick Check:
Code after return is unreachable [OK]
- Ignoring unreachable code warnings
- Forgetting to add wait between retries
- Not handling exceptions
You want to implement retry logic that tries up to 4 times with increasing wait times: 1s, 2s, 4s, then stops. Which code snippet correctly implements this?
Option A:
for i in range(3):
response = call_api()
if response.ok:
break
time.sleep(2 ** i)
Option B:
for i in range(1, 5):
response = call_api()
if response.ok:
break
time.sleep(i)
Option C:
for i in range(4):
response = call_api()
if response.ok:
break
time.sleep(i)
Option D:
for i in range(4):
response = call_api()
if response.ok:
break
time.sleep(2 * i)Solution
Step 1: Understand wait time pattern
Wait times should double each retry: 1s, 2s, 4s, then stop after 4 tries.Step 2: Check the options' sleep times
The code withtime.sleep(2 ** i)andrange(3)gives waits of 1s (i=0), 2s (i=1), 4s (i=2). This matches exponential backoff for up to 4 tries (3 retries after initial call).Step 3: Compare distractors
Therange(1,5)withtime.sleep(i)uses linear 1,2,3,4s.range(4)withtime.sleep(i)uses 0,1,2,3s.time.sleep(2 * i)uses 0,2,4,6s. None match doubling from 1s.Final Answer:
Option A -> Option AQuick Check:
Exponential backoff uses 2 ** i [OK]
- Starting wait time at 0 seconds
- Using linear instead of exponential waits
- Not stopping after max retries
Ready to prove it?
Pass the test and this pattern moves unknown
