Skip to content

Rate Limiting Pattern #2973 #3291

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 16 commits into
base: master
Choose a base branch
from
Open

Rate Limiting Pattern #2973 #3291

wants to merge 16 commits into from

Conversation

skamble2
Copy link

@skamble2 skamble2 commented Jun 1, 2025

Pull Request Template

What does this PR do?

This PR implements the Rate Limiting Design Pattern in Java using three different strategies:

  • Token Bucket
  • Fixed Window
  • Adaptive Rate Limiter

It simulates concurrent client requests to multiple services (S3, DynamoDB, Lambda) and applies appropriate rate-limiting logic to manage request throughput, prevent system overload, and simulate elastic behavior under pressure.

Copy link

github-actions bot commented Jun 1, 2025

PR Summary

This PR implements the Rate Limiting Design Pattern in Java using three different strategies: Token Bucket, Fixed Window, and Adaptive Rate Limiter. It simulates concurrent client requests to multiple services (S3, DynamoDB, Lambda) and applies appropriate rate-limiting logic to manage request throughput, prevent system overload, and simulate elastic behavior under pressure. The implementation includes comprehensive unit tests and diagrams.

Changes

File Summary
pom.xml The rate-limiting-pattern module was added to the project's modules.
rate-limiting-pattern/README.md A comprehensive README file was added, explaining the rate limiting pattern, its implementation, and including diagrams for each strategy.
rate-limiting-pattern/etc/AdaptiveRateLimiter.png New file.
rate-limiting-pattern/etc/FixedWindowRateLimiter.png New file.
rate-limiting-pattern/etc/TokenBucketRateLimiter.png New file.
rate-limiting-pattern/etc/UMLClassDiagram.png New file.
rate-limiting-pattern/pom.xml A pom.xml file was added for the rate-limiting-pattern module, defining dependencies and build configurations.
rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/AdaptiveRateLimiter.java This class implements an adaptive rate limiter that adjusts the rate based on system health, reducing the rate when throttling occurs and recovering periodically.
rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java This class simulates concurrent client requests to multiple services and applies rate limiting logic using the implemented strategies. It also prints statistics about the requests.
rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequest.java This class represents a rate-limited customer lookup operation, wrapping the rate limiting logic and simulating a business request.
rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiter.java This class implements a fixed window rate limiter that allows up to a certain number of requests within a fixed time window.
rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimitException.java New file.
rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimitOperation.java New file.
rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimiter.java New file.
rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/ServiceUnavailableException.java New file.
rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/ThrottlingException.java New file.
rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiter.java This class implements a token bucket rate limiter that allows requests to proceed as long as there are tokens available in the bucket.
rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AdaptiveRateLimiterTest.java Unit tests for the AdaptiveRateLimiter class, including tests for limit decrease on throttling and gradual increase when healthy.
rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTest.java Unit tests for the App class, covering various scenarios including successful requests, throttling, and service unavailability.
rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTestUtils.java New file.
rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/ConcurrencyTests.java Concurrency tests for the rate limiters, ensuring they handle concurrent requests correctly and that the adaptive limiter adjusts under load.
rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/ExceptionTests.java Unit tests for custom exceptions, verifying that they contain the expected information.
rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequestTest.java Unit tests for the FindCustomerRequest class, covering scenarios under and exceeding rate limits.
rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiterTest.java Unit tests for the FixedWindowRateLimiter class, including tests for counter reset after the window and limit enforcement.
rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/RateLimitOperationTest.java New file.
rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/RateLimiterTest.java New file.
rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiterTest.java Unit tests for the TokenBucketRateLimiter class, including tests for burst requests, token refill, and handling multiple services.

autogenerated by presubmit.ai

Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Review Summary

Commits Considered (3)
  • 331beb9: Updated README.md. All test case passed. Updated with Google Java Guidelines
  • ed01b7b: Added Class Diagram and Flow Diagrams for Adaptive, Fixed Window and Token Bucket Rate Limiter
  • dd0fc2b: need to fix one test case shouldGraduallyIncreaseLimitWhenHealthy failing for AdaptiveRateLimiter.java
Files Processed (25)
  • pom.xml (2 hunks)
  • rate-limiting-pattern/README.md (1 hunk)
  • rate-limiting-pattern/etc/AdaptiveRateLimiter.png (0 hunks)
  • rate-limiting-pattern/etc/FixedWindowRateLimiter.png (0 hunks)
  • rate-limiting-pattern/etc/TokenBucketRateLimiter.png (0 hunks)
  • rate-limiting-pattern/etc/UMLClassDiagram.png (0 hunks)
  • rate-limiting-pattern/pom.xml (1 hunk)
  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/AdaptiveRateLimiter.java (1 hunk)
  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java (1 hunk)
  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequest.java (1 hunk)
  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiter.java (1 hunk)
  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimitException.java (1 hunk)
  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimitOperation.java (1 hunk)
  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimiter.java (1 hunk)
  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/ServiceUnavailableException.java (1 hunk)
  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/ThrottlingException.java (1 hunk)
  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiter.java (1 hunk)
  • rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AdaptiveRateLimiterTest.java (1 hunk)
  • rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/ConcurrencyTests.java (1 hunk)
  • rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/ExceptionTests.java (1 hunk)
  • rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequestTest.java (1 hunk)
  • rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiterTest.java (1 hunk)
  • rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/RateLimitOperationTest.java (1 hunk)
  • rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/RateLimiterTest.java (1 hunk)
  • rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiterTest.java (1 hunk)
Actionable Comments (0)
Skipped Comments (0)

Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Review Summary

Commits Considered (1)
Files Processed (24)
  • rate-limiting-pattern/README.md (1 hunk)
  • rate-limiting-pattern/etc/AdaptiveRateLimiter.png (0 hunks)
  • rate-limiting-pattern/etc/FixedWindowRateLimiter.png (0 hunks)
  • rate-limiting-pattern/etc/TokenBucketRateLimiter.png (0 hunks)
  • rate-limiting-pattern/etc/UMLClassDiagram.png (0 hunks)
  • rate-limiting-pattern/pom.xml (1 hunk)
  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/AdaptiveRateLimiter.java (1 hunk)
  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java (1 hunk)
  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequest.java (1 hunk)
  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiter.java (1 hunk)
  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimitException.java (1 hunk)
  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimitOperation.java (1 hunk)
  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimiter.java (1 hunk)
  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/ServiceUnavailableException.java (1 hunk)
  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/ThrottlingException.java (1 hunk)
  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiter.java (1 hunk)
  • rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AdaptiveRateLimiterTest.java (1 hunk)
  • rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/ConcurrencyTests.java (1 hunk)
  • rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/ExceptionTests.java (1 hunk)
  • rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequestTest.java (1 hunk)
  • rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiterTest.java (1 hunk)
  • rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/RateLimitOperationTest.java (1 hunk)
  • rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/RateLimiterTest.java (1 hunk)
  • rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiterTest.java (1 hunk)
Actionable Comments (0)
Skipped Comments (0)

Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Review Summary

Commits Considered (1)
Files Processed (1)
  • pom.xml (1 hunk)
Actionable Comments (0)
Skipped Comments (0)

Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Review Summary

Commits Considered (1)
Files Processed (1)
  • rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiterTest.java (1 hunk)
Actionable Comments (0)
Skipped Comments (1)
  • rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiterTest.java [24-28]

    enhancement: "Improve test timing reliability."

Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Review Summary

Commits Considered (1)
Files Processed (1)
  • rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiterTest.java (1 hunk)
Actionable Comments (0)
Skipped Comments (1)
  • rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiterTest.java [26-29]

    enhancement: "Improve window reset check in shouldResetCounterAfterWindow test."

Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Review Summary

Commits Considered (6)
Files Processed (5)
  • rate-limiting-pattern/pom.xml (1 hunk)
  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java (1 hunk)
  • rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTest.java (1 hunk)
  • rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTestUtils.java (1 hunk)
  • rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequestTest.java (1 hunk)
Actionable Comments (0)
Skipped Comments (0)

Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Review Summary

Commits Considered (1)
Files Processed (1)
  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java (1 hunk)
Actionable Comments (0)
Skipped Comments (0)

Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Review Summary

Commits Considered (1)
Files Processed (1)
  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java (1 hunk)
Actionable Comments (0)
Skipped Comments (0)

Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Review Summary

Commits Considered (1)
Files Processed (1)
  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java (1 hunk)
Actionable Comments (0)
Skipped Comments (0)

Copy link

sonarqubecloud bot commented Jun 1, 2025

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant