Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 

Repository files navigation

Rate Limiter Implementation (Token Bucket & Sliding Window)

A rate limiting system implemented from scratch to control API request throughput and protect backend services from abuse, overload, and unfair resource usage.

This project focuses on algorithmic design, time-based logic, and system behavior under concurrent load, rather than framework usage.


Table of Contents

  • Overview
  • Motivation
  • What Is Rate Limiting
  • Algorithms Implemented
  • System Design
  • Data Structures Used
  • Time & Space Complexity
  • Concurrency Considerations
  • Edge Cases & Failure Scenarios
  • Tech Stack
  • Project Structure
  • How to Run
  • Design Decisions & Trade-offs
  • Limitations & Future Improvements

Overview

This project implements a rate limiter that restricts how frequently a client can make requests to a service.

It simulates a real-world backend component commonly used in:

  • API gateways
  • authentication services
  • distributed systems
  • microservice architectures

The implementation emphasizes correctness, fairness, and efficiency, rather than external tooling.


Motivation

Without rate limiting:

  • A single client can overwhelm a server
  • Backend resources can be exhausted
  • Fairness between users is lost
  • Systems become vulnerable to abuse

Rate limiting is a foundational backend concept, combining:

  • data structures
  • time-based logic
  • concurrency reasoning

This project was built to understand how rate limiting actually works, not just how to enable it in a framework.


What Is Rate Limiting

Rate limiting restricts the number of requests a client can make within a given time window.

Typical use cases:

  • Prevent brute-force attacks
  • Protect expensive endpoints
  • Enforce API usage policies
  • Ensure fair resource sharing

This project demonstrates algorithmic approaches to solving this problem.


Algorithms Implemented

1. Token Bucket Algorithm

Concept:

  • Tokens are added to a bucket at a fixed rate
  • Each request consumes one token
  • Requests are allowed only if a token is available

Why Token Bucket:

  • Allows short bursts of traffic
  • Smooths average request rate
  • Commonly used in real systems

2. Sliding Window Algorithm

Concept:

  • Tracks request timestamps within a moving time window
  • Counts only requests within the current window
  • Rejects requests once the limit is exceeded

Why Sliding Window:

  • More accurate than fixed windows
  • Prevents boundary burst issues
  • Strong fairness guarantees

System Design

The rate limiter is designed as a middleware-style component that can be integrated into a backend service.

Core responsibilities:

  • Identify client (IP / user / API key)
  • Track request history
  • Decide allow / reject per request
  • Enforce limits efficiently

The design mirrors how real API gateways work at a conceptual level.


Data Structures Used

Depending on the algorithm:

  • Hash Maps – map clients to state
  • Queues / Deques – store timestamps for sliding windows
  • Counters – track available tokens

The choice of data structures ensures:

  • fast lookups
  • predictable performance
  • low overhead per request

Time & Space Complexity

Token Bucket

  • Time Complexity: O(1) per request
  • Space Complexity: O(N) where N = number of clients

Sliding Window

  • Time Complexity: O(1) amortized per request
  • Space Complexity: O(N × R) where R = requests per window

These trade-offs are explicitly considered in the implementation.


Concurrency Considerations

  • Multiple requests may arrive simultaneously
  • Shared state must be updated safely
  • Race conditions can cause incorrect request counts

The project discusses:

  • why naive implementations fail
  • how concurrency affects correctness
  • what would be required for a thread-safe or distributed version

Concurrency is treated as a first-class concern, not an afterthought.


Edge Cases & Failure Scenarios

Handled cases include:

  • Burst traffic
  • Window boundary effects
  • New client initialization
  • Idle client cleanup
  • Clock drift considerations

These cases highlight why rate limiting is deceptively complex.


Tech Stack

  • Language: Java / C++ / Python / JavaScript (use what you implemented)
  • Core Concepts: Data Structures, Algorithms, Time-based Logic
  • Environment: Standalone backend component

No external rate-limiting libraries are used.


Project Structure

src/
├── limiter/        # Rate limiting logic
├── algorithms/     # Token Bucket and Sliding Window implementations
├── utils/          # Time and helper utilities
└── main            # Entry point / simulation

The structure emphasizes clarity and testability.


How to Run

git clone https://github.com/yourusername/rate-limiter
cd rate-limiter
# run command based on language

You can simulate requests to observe:

  • accepted vs rejected requests
  • behavior under burst traffic
  • differences between algorithms

Design Decisions & Trade-offs

  • Implemented multiple algorithms to compare fairness vs simplicity
  • Prioritized correctness over micro-optimizations
  • Avoided distributed complexity to keep reasoning clear
  • Explicitly analyzed algorithmic complexity

Each decision was made for learning value and interview explainability.


Limitations & Future Improvements

  • No distributed state sharing (e.g., Redis)
  • No persistence across restarts
  • No production-grade synchronization
  • No adaptive rate limits

These would be natural extensions in a real system.


Final Note

This project demonstrates that backend engineering is applied algorithms.

Rate limiting sits at the intersection of:

  • theory (DSA)
  • systems (concurrency)
  • real-world constraints (fairness, performance)

Understanding this deeply is essential for building reliable backend systems.


About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors