Skip to content

Rate Limiting Pattern #2973#3291

Merged
iluwatar merged 19 commits intoiluwatar:masterfrom
skamble2:master
Feb 22, 2026
Merged

Rate Limiting Pattern #2973#3291
iluwatar merged 19 commits intoiluwatar:masterfrom
skamble2:master

Conversation

@skamble2
Copy link
Contributor

@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.

@github-actions
Copy link

github-actions bot commented Jun 1, 2025

PR Summary

Implements the Rate Limiting Design Pattern in Java using three strategies (Token Bucket, Fixed Window, Adaptive Rate Limiter). Includes a demo App, per-operation limiters, tests, diagrams, and documentation. Updates the build to include a new rate-limiting-pattern module and provides comprehensive test coverage.

Changes

File Summary
pom.xml Updated the multi-module Maven build to include the new rate-limiting-pattern module in the project tree.
rate-limiting-pattern/README.md Added documentation describing the Rate Limiting Pattern with diagrams and usage examples.
rate-limiting-pattern/etc/AdaptiveRateLimiter.png Added a diagram image illustrating the AdaptiveRateLimiter component and its behavior.
rate-limiting-pattern/etc/FixedWindowRateLimiter.png Added a diagram image for the Fixed Window rate limiter.
rate-limiting-pattern/etc/TokenBucketRateLimiter.png Added a diagram image for the Token Bucket rate limiter.
rate-limiting-pattern/etc/UMLClassDiagram.png Added a UML class diagram showing core rate limiter components.
rate-limiting-pattern/pom.xml New module pom.xml for the rate-limiting-pattern module.
rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/AdaptiveRateLimiter.java Implemented AdaptiveRateLimiter with health-based limit adjustments and per-key limiters using a TokenBucketRateLimiter.
rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java Demo app coordinating Token Bucket, Fixed Window and Adaptive rate limiters across simulated clients.
rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequest.java RateLimitOperation wrapper for a FindCustomer use case, enforcing rate limits.
rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiter.java Fixed Window rate limiter implementation enforcing a fixed limit per time window.
rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimitException.java Base exception carrying retry-after information for rate-limiting events.
rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimitOperation.java Interface representing a rate-limited operation with service and operation names.
rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimiter.java Core interface for rate-limiter strategies.
rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/ServiceUnavailableException.java Exception for temporary service unavailability, extending RateLimitException.
rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/ThrottlingException.java Exception for AWS-style throttling events.
rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiter.java Token Bucket implementation with per-key buckets and periodic token refills.
rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AdaptiveRateLimiterTest.java Tests for adaptive limiter behavior, including throttle handling and recovery.
rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTest.java Unit tests for App using mocks to verify counters and limiter behavior.
rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTestUtils.java Test utilities to drive App and expose internal counters for assertions.
rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/ConcurrencyTests.java Concurrency tests for Token Bucket and Adaptive limiters under load.
rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/ExceptionTests.java Tests for RateLimitException and related exception types.
rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequestTest.java Tests for FindCustomerRequest interactions with the limiter.
rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiterTest.java Tests for FixedWindowRateLimiter including window reset behavior.
rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/RateLimitOperationTest.java Helper tests interface for rate-limited operations.
rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/RateLimiterTest.java Abstract tests for RateLimiter implementations.
rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiterTest.java Tests for TokenBucketRateLimiter features: burst, refill and multi-service handling.

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)
  • 54d7396: added test coverage for app.java and fixed random to be thread safe #2973
  • 4e886f8: added test coverage for app.java and fixed random to be thread safe #2973
  • 0889442: added test coverage for app.java and fixed random to be thread safe #2973
  • 5120195: added test coverage for app.java and fixed random to be thread safe #2973
  • 3a9de27: added test coverage for app.java and fixed random to be thread safe #2973
  • fe253e4: added test coverage for app.java and fixed random to be thread safe #2973
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)
  • b6002a5: added test coverage for app.java and fixed random to be thread safe #2973
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)

pom.xml Outdated
<module>visitor</module>
<module>backpressure</module>
<module>actor-model</module>
<module>rate-limiting-pattern</module>
Copy link
Contributor

Choose a reason for hiding this comment

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

can refactor spacing

<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.4.11</version>
</dependency>
Copy link
Contributor

Choose a reason for hiding this comment

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

refactor spacing

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/pom.xml (1 hunk)
Actionable Comments (0)
Skipped Comments (0)

@sonarqubecloud
Copy link

@github-actions
Copy link

This PR is stale because it has been open 60 days with no activity.

@github-actions github-actions bot added the Stale label Aug 12, 2025
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)
  • f3e0b4d: Merge branch 'master' into master
Files Processed (1)
  • pom.xml (1 hunk)
Actionable Comments (0)
Skipped Comments (1)
  • pom.xml [251-251]

    maintainability: "Introduce rate-limiting-pattern module"

@iluwatar
Copy link
Owner

Closes #2973

@sonarqubecloud
Copy link

Quality Gate Failed Quality Gate failed

Failed conditions
D Reliability Rating on New Code (required ≥ A)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

@iluwatar iluwatar merged commit 265e3d0 into iluwatar:master Feb 22, 2026
2 checks passed
@iluwatar
Copy link
Owner

@all-contributors please add @skamble2 for code

@allcontributors
Copy link
Contributor

@iluwatar

I've put up a pull request to add @skamble2! 🎉

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants