Why rate limiting protects services in Rest API - Performance Analysis
Start learning this pattern below
Jump into concepts and practice - no test required
When we protect services with rate limiting, we want to see how the cost of handling requests grows as more users send requests.
We ask: How does the system's work increase when many requests come in?
Analyze the time complexity of the following rate limiting check.
// Pseudocode for rate limiting check
function checkRateLimit(userId, timestamp) {
requests = getRequestsForUser(userId) // list of past request times
recentRequests = filter(requests, r => r > timestamp - window)
if (recentRequests.length > limit) {
return false // block request
}
addRequest(userId, timestamp)
return true // allow request
}
This code checks how many requests a user made recently and blocks if too many.
Look for repeated work done each time a request comes in.
- Primary operation: Filtering the user's past requests to find recent ones.
- How many times: This filtering happens every time a new request arrives.
As the number of requests a user makes grows, the filtering step takes longer.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | Check 10 past requests |
| 100 | Check 100 past requests |
| 1000 | Check 1000 past requests |
Pattern observation: The work grows directly with how many past requests are stored.
Time Complexity: O(n)
This means the time to check rate limits grows linearly with the number of stored requests.
[X] Wrong: "Rate limiting always takes constant time no matter how many requests."
[OK] Correct: Because filtering past requests depends on how many requests are stored, the time can grow as more requests accumulate.
Understanding how rate limiting scales helps you design services that stay fast and reliable even when many users send requests.
"What if we stored only the count of requests instead of the full list? How would the time complexity change?"
Practice
Solution
Step 1: Understand what rate limiting does
Rate limiting sets a maximum number of requests a user can make in a certain time period.Step 2: Identify the main goal of rate limiting
This helps protect the service from overload and unfair use by controlling request frequency.Final Answer:
To control how many requests a user can make in a set time -> Option CQuick Check:
Rate limiting = controlling request count [OK]
- Thinking rate limiting speeds up server
- Confusing rate limiting with data storage
- Believing rate limiting allows unlimited access
Solution
Step 1: Recall standard rate limit header names
The common header to indicate rate limits isX-RateLimit-Limit.Step 2: Check the format correctness
X-RateLimit-Limit: 1000 uses the correct header name and a numeric limit value, which is standard.Final Answer:
X-RateLimit-Limit: 1000 -> Option BQuick Check:
Standard header = X-RateLimit-Limit [OK]
- Using incorrect header names like RateLimit or Limit-Rate
- Adding extra words in header value
- Confusing header format with body content
requests = 0
limit = 3
for request in incoming_requests:
if requests < limit:
process(request)
requests += 1
else:
reject(request)
What happens when 5 requests arrive quickly?Solution
Step 1: Understand the limit and counter
The limit is 3, and requests start at 0. Each processed request increments the counter.Step 2: Trace the 5 incoming requests
First 3 requests meet requests < limit, so processed. The 4th and 5th exceed limit, so rejected.Final Answer:
Only 3 requests are processed; 2 are rejected -> Option AQuick Check:
Limit 3 means max 3 processed [OK]
- Assuming all requests are processed
- Ignoring the requests counter increment
- Thinking only one request is allowed
requests = 0
limit = 2
for req in requests_list:
if requests > limit:
reject(req)
else:
process(req)
requests += 1
What is the bug?Solution
Step 1: Analyze the if condition logic
The code rejects requests when requests > limit, but it should allow requests while requests < limit.Step 2: Understand correct rate limiting condition
To process requests up to the limit, the condition must check if requests < limit before processing.Final Answer:
The condition should be requests < limit, not requests > limit -> Option AQuick Check:
Process if requests < limit [OK]
- Using greater than instead of less than in condition
- Forgetting to increment requests counter
- Confusing variable names in loop
Solution
Step 1: Calculate total requests in one minute
User sends 3 + 4 = 7 requests within one minute, exceeding the 5 request limit.Step 2: Understand rate limiting enforcement
Requests beyond the limit (the last 2) should be rejected to protect the service.Final Answer:
They are rejected because the 5 requests per minute limit is exceeded -> Option DQuick Check:
Requests > 5 per minute are rejected [OK]
- Assuming requests reset automatically before a minute
- Thinking all requests are accepted if under 10
- Believing requests are delayed instead of rejected
