feat: add Microservices Load Shedding pattern (#3229) - #3599
Conversation
PR SummaryIntroduces a new microservices-load-shedding module implementing the Load Shedding pattern with capacity-based admission control and prioritization. The module provides Priority, Request, Response, LoadShedder, LoadShedException, ShedGuardedService, and a runnable App demo, plus unit tests (AppTest, LoadShedderTest, ShedGuardedServiceTest). Includes documentation (README), a PlantUML diagram, and a module POM. The root pom.xml is updated to include this module. Changes
autogenerated by presubmit.ai |
There was a problem hiding this comment.
🚨 Pull request needs attention.
Review Summary
Files Processed (15)
- microservices-load-shedding/README.md (1 hunk)
- microservices-load-shedding/etc/microservices-load-shedding.urm.puml (1 hunk)
- microservices-load-shedding/pom.xml (1 hunk)
- microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/App.java (1 hunk)
- microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/LoadShedException.java (1 hunk)
- microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/LoadShedder.java (1 hunk)
- microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/Priority.java (1 hunk)
- microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/Request.java (1 hunk)
- microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/RequestHandler.java (1 hunk)
- microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/Response.java (1 hunk)
- microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/ShedGuardedService.java (1 hunk)
- microservices-load-shedding/src/test/java/com/iluwatar/loadshedding/AppTest.java (1 hunk)
- microservices-load-shedding/src/test/java/com/iluwatar/loadshedding/LoadShedderTest.java (1 hunk)
- microservices-load-shedding/src/test/java/com/iluwatar/loadshedding/ShedGuardedServiceTest.java (1 hunk)
- pom.xml (1 hunk)
Actionable Comments (2)
-
microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/App.java [88-93]
possible bug: "Logger field name mismatch with Lombok annotation"
-
microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/ShedGuardedService.java [68-74]
possible bug: "Logger usage should use generated logger name (admission log)"
Skipped Comments (1)
-
pom.xml [263-263]
enhancement: "Module wiring: add microservices-load-shedding"
| LOGGER.info( | ||
| "Order service capacity: {} in flight, low priority shed at {}, {} slot reserved for" | ||
| + " critical requests", | ||
| CAPACITY, | ||
| LOW_PRIORITY_LIMIT, | ||
| CRITICAL_RESERVE); |
There was a problem hiding this comment.
| LOGGER.info( | ||
| "[{}] admitted {} ({}), {}/{} in flight", | ||
| name, | ||
| request.id(), | ||
| request.priority(), | ||
| shedder.getInFlight(), | ||
| shedder.getMaxInFlight()); |
There was a problem hiding this comment.
Similar issue as above for the admission log path. Replace LOGGER.info with log.info to ensure logging compiles and follows Lombok's generated logger name.
|
Note on the automated review comments: |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #3599 +/- ##
============================================
+ Coverage 83.79% 83.95% +0.16%
- Complexity 4277 4322 +45
============================================
Files 1121 1128 +7
Lines 15144 15284 +140
Branches 723 732 +9
============================================
+ Hits 12690 12832 +142
+ Misses 2159 2157 -2
Partials 295 295 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
50b5af8 to
6d9f7e0
Compare
|
Follow-up on the Codecov note: completed the |
There was a problem hiding this comment.
✅ LGTM!
Review Summary
Files Processed (15)
- microservices-load-shedding/README.md (1 hunk)
- microservices-load-shedding/etc/microservices-load-shedding.urm.puml (1 hunk)
- microservices-load-shedding/pom.xml (1 hunk)
- microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/App.java (1 hunk)
- microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/LoadShedException.java (1 hunk)
- microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/LoadShedder.java (1 hunk)
- microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/Priority.java (1 hunk)
- microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/Request.java (1 hunk)
- microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/RequestHandler.java (1 hunk)
- microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/Response.java (1 hunk)
- microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/ShedGuardedService.java (1 hunk)
- microservices-load-shedding/src/test/java/com/iluwatar/loadshedding/AppTest.java (1 hunk)
- microservices-load-shedding/src/test/java/com/iluwatar/loadshedding/LoadShedderTest.java (1 hunk)
- microservices-load-shedding/src/test/java/com/iluwatar/loadshedding/ShedGuardedServiceTest.java (1 hunk)
- pom.xml (1 hunk)
Actionable Comments (0)
Skipped Comments (2)
-
microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/App.java [87-94]
bug: "Fix logger usage with Lombok @slf4j in App"
-
microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/ShedGuardedService.java [65-75]
bug: "Logger field name mismatch in ShedGuardedService"
6d9f7e0 to
c5ba691
Compare
|
Coverage follow-up: |
There was a problem hiding this comment.
🚨 Pull request needs attention.
Review Summary
Files Processed (15)
- microservices-load-shedding/README.md (1 hunk)
- microservices-load-shedding/etc/microservices-load-shedding.urm.puml (1 hunk)
- microservices-load-shedding/pom.xml (1 hunk)
- microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/App.java (1 hunk)
- microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/LoadShedException.java (1 hunk)
- microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/LoadShedder.java (1 hunk)
- microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/Priority.java (1 hunk)
- microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/Request.java (1 hunk)
- microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/RequestHandler.java (1 hunk)
- microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/Response.java (1 hunk)
- microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/ShedGuardedService.java (1 hunk)
- microservices-load-shedding/src/test/java/com/iluwatar/loadshedding/AppTest.java (1 hunk)
- microservices-load-shedding/src/test/java/com/iluwatar/loadshedding/LoadShedderTest.java (1 hunk)
- microservices-load-shedding/src/test/java/com/iluwatar/loadshedding/ShedGuardedServiceTest.java (1 hunk)
- pom.xml (1 hunk)
Actionable Comments (2)
-
microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/App.java [90-96]
best_practice: "Logger name mismatch with Lombok @slf4j in App"
-
microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/ShedGuardedService.java [68-75]
best_practice: "Logger usage mismatch with Lombok @slf4j in ShedGuardedService (admission log)"
Skipped Comments (0)
| LOGGER.info( | ||
| "Order service capacity: {} in flight, low priority shed at {}, {} slot reserved for" | ||
| + " critical requests", | ||
| CAPACITY, | ||
| LOW_PRIORITY_LIMIT, | ||
| CRITICAL_RESERVE); | ||
|
|
There was a problem hiding this comment.
Replace the Lombok-generated logger reference (log) instead of the plain 'LOGGER' used in this class. Lombok's @slf4j generates a 'log' field, not 'LOGGER'. This will fail to compile. Update all occurrences in this file to use 'log'.
| LOGGER.info( | ||
| "[{}] admitted {} ({}), {}/{} in flight", | ||
| name, | ||
| request.id(), | ||
| request.priority(), | ||
| shedder.getInFlight(), | ||
| shedder.getMaxInFlight()); | ||
| try { |
There was a problem hiding this comment.
Similarly, replace the subsequent log statement that announces admission with the Lombok-provided logger (log) to ensure compile-time correctness.
What does this PR do?
Adds the Microservices Load Shedding pattern as a new
microservices-load-sheddingmodule.LoadShedderperforms capacity-based, priority-aware admission control at the service entry point. Excess requests are rejected immediately (fail fast) instead of being queued; low-priority work is shed first and a reserve of capacity is kept for critical requests.Priority,Request,Response: the request model with CRITICAL / NORMAL / LOW priorities.LoadShedder: hard capacity, low-priority limit and critical reserve; lock-free compare-and-set admission so capacity is never exceeded; per-priority shed counters.LoadShedException: the fast rejection ("503, retry later").ShedGuardedServiceandRequestHandler: wrap the business logic and always release the capacity slot, even when the handler throws.App: light load (everything admitted), payment provider slows down and orders pile up (LOW and NORMAL probes are shed, CRITICAL checkout still admitted), provider recovers (admission resumes), then a metrics summary. Logging traces every decision.README.md: intent, real-world example, flowchart, code walkthrough, applicability, trade-offs, and how load shedding differs from rate limiting, throttling, backpressure and queue-based load leveling. PlantUML class diagram underetc/.AppTest.pom.xml../mvnw clean verify -pl microservices-load-sheddingpasses locally on JDK 21 and inside aneclipse-temurin:21container.Fixes #3229