feat: add Microservices Load Shedding pattern (#3229) - #3599
Conversation
PR SummaryIntroduced a new Microservices Load Shedding pattern module providing capacity-based, priority-aware admission control at the service entry point. Excess requests are rejected immediately to protect latency for critical flows. Includes Priority, Request, and Response models, a LoadShedder with per-priority shedding, a ShedGuardedService wrapper, an App demo, unit tests, and README with diagrams, trade-offs and usage guidance. 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"
|
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.87% +0.07%
- Complexity 4277 4315 +38
============================================
Files 1121 1128 +7
Lines 15144 15285 +141
Branches 723 732 +9
============================================
+ Hits 12690 12820 +130
- Misses 2159 2169 +10
- Partials 295 296 +1 ☔ 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)
There was a problem hiding this comment.
✅ LGTM!
Review Summary
Commits Considered (3)
- ba7abd5: docs: embed the rendered class diagram in the load shedding README
Render etc/microservices-load-shedding.urm.puml to PNG and embed it in the detailed explanation section, matching the other modules, instead of the inline mermaid block.
- c23efa2: chore: report total shed count in the demo and add serialVersionUID
The demo summary now logs LoadShedder.getTotalShed() alongside the per-priority
counters, so the aggregate metric has a caller outside the tests. LoadShedException
declares serialVersionUID, matching the exception style used in the commander module.
The README sample output is refreshed from an actual run.
-
9bac89a: fix: guard load shedder release and log the admitted in-flight count
-
LoadShedder.release() clamps the in-flight count at zero so an unmatched
release cannot drive it negative and permanently inflate capacity -
LoadShedder.acquire() returns the in-flight count including the admitted
request, and ShedGuardedService logs that value instead of re-reading the
counter, which under concurrency could report another request's number -
README: replace the raw .puml link with an inline mermaid class diagram, and
keep the code snippets in sync with the two changes above
Files Processed (8)
- microservices-load-shedding/README.md (1 hunk)
- microservices-load-shedding/etc/microservices-load-shedding.urm.png (0 hunks)
- microservices-load-shedding/etc/microservices-load-shedding.urm.puml (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/ShedGuardedService.java (1 hunk)
- microservices-load-shedding/src/test/java/com/iluwatar/loadshedding/LoadShedderTest.java (1 hunk)
Actionable Comments (0)
Skipped Comments (3)
-
microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/App.java [90-96]
maintainability: "Logger name mismatch with Lombok-generated logger"
-
microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/ShedGuardedService.java [68-69]
maintainability: "Logger usage should match Lombok-provided logger"
-
microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/ShedGuardedService.java [71-78]
maintainability: "Logger usage should match Lombok-provided logger (admission log)"
release() clamps the in-flight count at zero, acquire() returns the admitted count that the service logs, and the demo summary reports the total shed. The class diagram is a rendered PNG.
ba7abd5 to
8ce89ea
Compare
There was a problem hiding this comment.
🚨 Pull request needs attention.
Review Summary
Commits Considered (1)
- 8ce89ea: fix: harden load shedder release and report the admitted count
release() clamps the in-flight count at zero, acquire() returns the admitted count that the service logs, and the demo summary reports the total shed. The class diagram is a rendered PNG.
Files Processed (8)
- microservices-load-shedding/README.md (1 hunk)
- microservices-load-shedding/etc/microservices-load-shedding.urm.png (0 hunks)
- microservices-load-shedding/etc/microservices-load-shedding.urm.puml (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/ShedGuardedService.java (1 hunk)
- microservices-load-shedding/src/test/java/com/iluwatar/loadshedding/LoadShedderTest.java (1 hunk)
Actionable Comments (1)
-
microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/App.java [90-96]
readability: "Logger name mismatch with Lombok @slf4j"
Skipped Comments (2)
-
microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/ShedGuardedService.java [61-83]
readability: "Logger name mismatch with Lombok @slf4j (ShedGuardedService)"
-
microservices-load-shedding/src/main/java/com/iluwatar/loadshedding/App.java [191-193]
readability: "Logger name mismatch in App.java report method"
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