From d4cf7432ff9a85ce24185a9356d792e9b6f30a47 Mon Sep 17 00:00:00 2001 From: "lancer.hong" Date: Thu, 21 Apr 2022 17:51:19 +0800 Subject: [PATCH] Optimize TimeSlot fields --- .../src/main/java/we/stats/FlowStat.java | 4 +- .../src/main/java/we/stats/ResourceStat.java | 62 +++++----- .../src/main/java/we/stats/TimeSlot.java | 108 +++++++++++++----- .../circuitbreaker/CircuitBreakManager.java | 4 +- .../stats/circuitbreaker/CircuitBreaker.java | 39 ++++--- .../CircuitBreakManagerTests.java | 6 +- 6 files changed, 139 insertions(+), 84 deletions(-) diff --git a/fizz-core/src/main/java/we/stats/FlowStat.java b/fizz-core/src/main/java/we/stats/FlowStat.java index 0dd9e7e..d621099 100644 --- a/fizz-core/src/main/java/we/stats/FlowStat.java +++ b/fizz-core/src/main/java/we/stats/FlowStat.java @@ -175,7 +175,7 @@ public class FlowStat { // check QPS if (maxQPS > 0) { - long total = resourceStat.getTimeSlot(curTimeSlotId).getCounter().get(); + long total = resourceStat.getTimeSlot(curTimeSlotId).getCounter(); if (total >= maxQPS) { resourceStat.incrBlockRequestToTimeSlot(curTimeSlotId); if (totalBlockFunc != null) { @@ -242,7 +242,7 @@ public class FlowStat { // check QPS if (maxQPS > 0) { - long total = resourceStat.getTimeSlot(curTimeSlotId).getCounter().get(); + long total = resourceStat.getTimeSlot(curTimeSlotId).getCounter(); if (total >= maxQPS) { resourceStat.incrBlockRequestToTimeSlot(curTimeSlotId); if (totalBlockFunc != null) { diff --git a/fizz-core/src/main/java/we/stats/ResourceStat.java b/fizz-core/src/main/java/we/stats/ResourceStat.java index f3e1ed1..5f70eca 100644 --- a/fizz-core/src/main/java/we/stats/ResourceStat.java +++ b/fizz-core/src/main/java/we/stats/ResourceStat.java @@ -127,7 +127,8 @@ public class ResourceStat { * */ public void incrBlockRequestToTimeSlot(long timeSlotId) { - this.getTimeSlot(timeSlotId).getBlockRequests().incrementAndGet(); +// this.getTimeSlot(timeSlotId).getBlockRequests().incrementAndGet(); + this.getTimeSlot(timeSlotId).incrBlockRequests(); } /** @@ -135,7 +136,8 @@ public class ResourceStat { * */ public void incrTotalBlockRequestToTimeSlot(long timeSlotId) { - this.getTimeSlot(timeSlotId).getTotalBlockRequests().incrementAndGet(); +// this.getTimeSlot(timeSlotId).getTotalBlockRequests().incrementAndGet(); + this.getTimeSlot(timeSlotId).incrTotalBlockRequests(); } /** @@ -156,7 +158,7 @@ public class ResourceStat { // } // time slot unit is one second - long total = this.getTimeSlot(timeSlotId).getCounter().get(); + long total = this.getTimeSlot(timeSlotId).getCounter(); long max = Long.valueOf(maxRPS); if (total >= max) { isExceeded = true; @@ -179,28 +181,28 @@ public class ResourceStat { } public void incrCircuitBreakNum(long timeSlot) { - getTimeSlot(timeSlot).getCircuitBreakNum().incrementAndGet(); + getTimeSlot(timeSlot).incrCircuitBreakNum(); } - public void decrCircuitBreakNum(long timeSlot) { - getTimeSlot(timeSlot).getCircuitBreakNum().decrementAndGet(); - } - - public void incrGradualResumeNum(long timeSlot) { - getTimeSlot(timeSlot).getGradualResumeNum().incrementAndGet(); - } - - public void decrGradualResumeNum(long timeSlot) { - getTimeSlot(timeSlot).getGradualResumeNum().decrementAndGet(); - } - - public void incrGradualRejectNum(long timeSlot) { - getTimeSlot(timeSlot).getGradualRejectNum().incrementAndGet(); - } - - public void decrGradualRejectNum(long timeSlot) { - getTimeSlot(timeSlot).getGradualRejectNum().decrementAndGet(); - } +// public void decrCircuitBreakNum(long timeSlot) { +// getTimeSlot(timeSlot).getCircuitBreakNum().decrementAndGet(); +// } +// +// public void incrGradualResumeNum(long timeSlot) { +// getTimeSlot(timeSlot).getGradualResumeNum().incrementAndGet(); +// } +// +// public void decrGradualResumeNum(long timeSlot) { +// getTimeSlot(timeSlot).getGradualResumeNum().decrementAndGet(); +// } +// +// public void incrGradualRejectNum(long timeSlot) { +// getTimeSlot(timeSlot).getGradualRejectNum().incrementAndGet(); +// } +// +// public void decrGradualRejectNum(long timeSlot) { +// getTimeSlot(timeSlot).getGradualRejectNum().decrementAndGet(); +// } public void incr2xxStatusCount(long timeSlot) { getTimeSlot(timeSlot).get2xxStatusCount().incrementAndGet(); @@ -267,13 +269,13 @@ public class ResourceStat { peakConcurrences = timeSlot.getPeakConcurrentRequests() > peakConcurrences ? timeSlot.getPeakConcurrentRequests() : peakConcurrences; - peakRps = timeSlot.getCounter().get() > peakRps ? timeSlot.getCounter().get() : peakRps; - totalReqs = totalReqs + timeSlot.getCounter().get(); - totalRt = totalRt + timeSlot.getTotalRt().get(); - errors = errors + timeSlot.getErrors().get(); - blockReqs = blockReqs + timeSlot.getBlockRequests().get(); - totalBlockReqs = totalBlockReqs + timeSlot.getTotalBlockRequests().get(); - compReqs = compReqs + timeSlot.getCompReqs().get(); + peakRps = timeSlot.getCounter() > peakRps ? timeSlot.getCounter() : peakRps; + totalReqs = totalReqs + timeSlot.getCounter(); + totalRt = totalRt + timeSlot.getTotalRt(); + errors = errors + timeSlot.getErrors(); + blockReqs = blockReqs + timeSlot.getBlockRequests(); + totalBlockReqs = totalBlockReqs + timeSlot.getTotalBlockRequests(); + compReqs = compReqs + timeSlot.getCompReqs(); _2xxStatus = _2xxStatus + timeSlot.get2xxStatusCount().get(); _4xxStatus = _4xxStatus + timeSlot.get4xxStatusCount().get(); diff --git a/fizz-core/src/main/java/we/stats/TimeSlot.java b/fizz-core/src/main/java/we/stats/TimeSlot.java index 2b89508..642a6c7 100644 --- a/fizz-core/src/main/java/we/stats/TimeSlot.java +++ b/fizz-core/src/main/java/we/stats/TimeSlot.java @@ -37,12 +37,14 @@ public class TimeSlot { /** * Request counter */ - private AtomicLong counter = new AtomicLong(); +// private AtomicLong counter = new AtomicLong(); + private volatile int counter = 0; /** * Error request counter */ - private AtomicLong errors = new AtomicLong(); +// private AtomicLong errors = new AtomicLong(); + private volatile int errors = 0; /** * Minimum response time @@ -57,12 +59,14 @@ public class TimeSlot { /** * Total response time */ - private AtomicLong totalRt = new AtomicLong(0); +// private AtomicLong totalRt = new AtomicLong(0); + private volatile long totalRt = 0; /** * Completed Request counter */ - private AtomicLong compReqs = new AtomicLong(); +// private AtomicLong compReqs = new AtomicLong(); + private volatile int compReqs = 0; /** @@ -73,23 +77,28 @@ public class TimeSlot { /** * Block requests
*/ - private AtomicLong blockRequests = new AtomicLong(0); +// private AtomicLong blockRequests = new AtomicLong(0); + private volatile int blockRequests = 0; /** * Total block requests of the resource and its underlying resources
*/ - private AtomicLong totalBlockRequests = new AtomicLong(0); - +// private AtomicLong totalBlockRequests = new AtomicLong(0); + private volatile long totalBlockRequests = 0; private AtomicReference circuitBreakState = new AtomicReference<>(CircuitBreaker.State.CLOSED); - private AtomicLong circuitBreakNum = new AtomicLong(0); +// private AtomicLong circuitBreakNum = new AtomicLong(0); + private volatile int circuitBreakNum = 0; - private AtomicLong gradualResumeNum = new AtomicLong(0); +// private AtomicLong gradualResumeNum = new AtomicLong(0); + private volatile int gradualResumeNum = 0; - private AtomicInteger resumeTrafficFactor = new AtomicInteger(1); +// private AtomicInteger resumeTrafficFactor = new AtomicInteger(1); + private volatile int resumeTrafficFactor = 1; - private AtomicLong gradualRejectNum = new AtomicLong(0); +// private AtomicLong gradualRejectNum = new AtomicLong(0); + private volatile int gradualRejectNum = 0; private AtomicInteger _2xxStatusCount = new AtomicInteger(0); @@ -119,22 +128,50 @@ public class TimeSlot { return circuitBreakState; } - public AtomicLong getCircuitBreakNum() { + public int getCircuitBreakNum() { return circuitBreakNum; } - public AtomicLong getGradualResumeNum() { + public void setCircuitBreakNum(int v) { + circuitBreakNum = v; + } + + public void incrCircuitBreakNum() { + ++circuitBreakNum; + } + + public int getGradualResumeNum() { return gradualResumeNum; } - public AtomicInteger getResumeTrafficFactor() { + public int incrGradualResumeNum() { + return ++gradualResumeNum; + } + + public int decrGradualResumeNum() { + return --gradualResumeNum; + } + + public int getResumeTrafficFactor() { return resumeTrafficFactor; } - public AtomicLong getGradualRejectNum() { + public void incrResumeTrafficFactor() { + ++resumeTrafficFactor; + } + + public int getGradualRejectNum() { return gradualRejectNum; } + public int incrGradualRejectNum() { + return ++gradualRejectNum; + } + + public int decrGradualRejectNum() { + return --gradualRejectNum; + } + public TimeSlot(long id) { this.id = id; @@ -149,7 +186,8 @@ public class TimeSlot { * */ public void incr() { - counter.incrementAndGet(); + // counter.incrementAndGet(); + ++counter; } /** @@ -159,10 +197,10 @@ public class TimeSlot { * @param isSuccess Whether the request is success or not */ public synchronized void addRequestRT(long rt, boolean isSuccess) { - totalRt.addAndGet(rt); - compReqs.incrementAndGet(); + totalRt += rt; + ++compReqs; if (!isSuccess) { - errors.incrementAndGet(); + ++errors; } min = rt < min ? rt : min; max = rt > max ? rt : max; @@ -182,11 +220,11 @@ public class TimeSlot { this.id = id; } - public AtomicLong getCounter() { + public int getCounter() { return counter; } - public void setCounter(AtomicLong counter) { + public void setCounter(int counter) { this.counter = counter; } @@ -206,11 +244,11 @@ public class TimeSlot { this.max = max; } - public AtomicLong getTotalRt() { + public long getTotalRt() { return totalRt; } - public void setTotalRt(AtomicLong totalRt) { + public void setTotalRt(long totalRt) { this.totalRt = totalRt; } @@ -222,35 +260,43 @@ public class TimeSlot { this.peakConcurrentRequests = peakConcurrentRequests; } - public AtomicLong getErrors() { + public int getErrors() { return errors; } - public void setErrors(AtomicLong errors) { + public void setErrors(int errors) { this.errors = errors; } - public AtomicLong getBlockRequests() { + public int getBlockRequests() { return blockRequests; } - public void setBlockRequests(AtomicLong blockRequests) { + public void setBlockRequests(int blockRequests) { this.blockRequests = blockRequests; } - public AtomicLong getCompReqs() { + public void incrBlockRequests() { + ++blockRequests; + } + + public int getCompReqs() { return compReqs; } - public void setCompReqs(AtomicLong compReqs) { + public void setCompReqs(int compReqs) { this.compReqs = compReqs; } - public AtomicLong getTotalBlockRequests() { + public long getTotalBlockRequests() { return totalBlockRequests; } - public void setTotalBlockRequests(AtomicLong totalBlockRequests) { + public void incrTotalBlockRequests() { + ++totalBlockRequests; + } + + public void setTotalBlockRequests(long totalBlockRequests) { this.totalBlockRequests = totalBlockRequests; } diff --git a/fizz-core/src/main/java/we/stats/circuitbreaker/CircuitBreakManager.java b/fizz-core/src/main/java/we/stats/circuitbreaker/CircuitBreakManager.java index 82feaf9..9a76112 100644 --- a/fizz-core/src/main/java/we/stats/circuitbreaker/CircuitBreakManager.java +++ b/fizz-core/src/main/java/we/stats/circuitbreaker/CircuitBreakManager.java @@ -264,7 +264,7 @@ public class CircuitBreakManager { } }*/ - public void correctCircuitBreakerStateAsError(ServerWebExchange exchange, long currentTimeWindow, FlowStat flowStat, String service, String path) { + /*public void correctCircuitBreakerStateAsError(ServerWebExchange exchange, long currentTimeWindow, FlowStat flowStat, String service, String path) { String resource = ResourceIdUtils.buildResourceId(null, null, null, service, path); // correctCircuitBreakerState4error(exchange, currentTimeWindow, flowStat, resource); CircuitBreaker cb = resource2circuitBreakerMap.get(resource); @@ -290,7 +290,7 @@ public class CircuitBreakManager { } cb.correctCircuitBreakerStateAsError(currentTimeWindow, flowStat); } - } + }*/ /*public void correctCircuitBreakerState4error(ServerWebExchange exchange, long currentTimeWindow, FlowStat flowStat, String resource) { while (true) { diff --git a/fizz-core/src/main/java/we/stats/circuitbreaker/CircuitBreaker.java b/fizz-core/src/main/java/we/stats/circuitbreaker/CircuitBreaker.java index 2b1fefd..3f96bf9 100644 --- a/fizz-core/src/main/java/we/stats/circuitbreaker/CircuitBreaker.java +++ b/fizz-core/src/main/java/we/stats/circuitbreaker/CircuitBreaker.java @@ -77,25 +77,31 @@ public class CircuitBreaker { public boolean permit(ResourceStat resourceStat, long currentTimeWindow) { TimeSlot timeSlot = resourceStat.getTimeSlot(currentTimeWindow); - AtomicLong resumeCount = timeSlot.getGradualResumeNum(); - AtomicInteger resumeTrafficFactor = timeSlot.getResumeTrafficFactor(); - long n = resumeTrafficFactor.get(); - if (resumeCount.incrementAndGet() <= resumeTraffic * n) { + // AtomicLong resumeCount = timeSlot.getGradualResumeNum(); + // AtomicInteger resumeTrafficFactor = timeSlot.getResumeTrafficFactor(); + // long n = resumeTrafficFactor.get(); + long n = timeSlot.getResumeTrafficFactor(); + // if (resumeCount.incrementAndGet() <= resumeTraffic * n) { + if (timeSlot.incrGradualResumeNum() <= resumeTraffic * n) { LOGGER.debug("{} current time window {}, resume traffic {}, resume traffic factor {}, resume count {}, resume current request", - resourceStat.getResourceId(), currentTimeWindow, resumeTraffic, n, resumeCount.get()); + resourceStat.getResourceId(), currentTimeWindow, resumeTraffic, n, timeSlot.getGradualResumeNum()); return true; } - AtomicLong rejectCount = timeSlot.getGradualRejectNum(); - if (rejectCount.incrementAndGet() <= rejectTraffic * n) { - resumeCount.decrementAndGet(); + // AtomicLong rejectCount = timeSlot.getGradualRejectNum(); + // if (rejectCount.incrementAndGet() <= rejectTraffic * n) { + if (timeSlot.incrGradualRejectNum() <= rejectTraffic * n) { + // resumeCount.decrementAndGet(); + timeSlot.decrGradualResumeNum(); LOGGER.debug("{} current time window {}, reject traffic {}, resume traffic factor {}, reject count {}, reject current request", - resourceStat.getResourceId(), currentTimeWindow, rejectTraffic, n, rejectCount.get()); + resourceStat.getResourceId(), currentTimeWindow, rejectTraffic, n, timeSlot.getGradualRejectNum()); return false; } - rejectCount.decrementAndGet(); - resumeTrafficFactor.incrementAndGet(); + // rejectCount.decrementAndGet(); + timeSlot.decrGradualRejectNum(); + // resumeTrafficFactor.incrementAndGet(); + timeSlot.incrResumeTrafficFactor(); LOGGER.debug("{} current time window {}, resume traffic {}, reject traffic {}, resume traffic factor {}, resume count {}, reject count {}, resume current request", - resourceStat.getResourceId(), currentTimeWindow, resumeTraffic, rejectTraffic, n, resumeCount.get(), rejectCount.get()); + resourceStat.getResourceId(), currentTimeWindow, resumeTraffic, rejectTraffic, n, timeSlot.getGradualResumeNum(), timeSlot.getGradualRejectNum()); return true; } @@ -286,7 +292,7 @@ public class CircuitBreaker { } } - public void correctCircuitBreakerStateAsError(long currentTimeWindow, FlowStat flowStat) { + /*public void correctCircuitBreakerStateAsError(long currentTimeWindow, FlowStat flowStat) { if (stateRef.get() == State.CLOSED) { long endTimeWindow = currentTimeWindow + 1000; // TimeWindowStat timeWindowStat = flowStat.getTimeWindowStat(resource, endTimeWindow - monitorDuration, endTimeWindow); @@ -309,14 +315,15 @@ public class CircuitBreaker { } } } - } + }*/ public boolean transit(State current, State target, long currentTimeWindow, FlowStat flowStat) { if (stateRef.compareAndSet(current, target)) { stateStartTime = currentTimeWindow; ResourceStat resourceStat = flowStat.getResourceStat(resource); - AtomicLong circuitBreakNum = resourceStat.getTimeSlot(currentTimeWindow).getCircuitBreakNum(); - circuitBreakNum.set(0); + /*AtomicLong circuitBreakNum = resourceStat.getTimeSlot(currentTimeWindow).getCircuitBreakNum(); + circuitBreakNum.set(0);*/ + resourceStat.getTimeSlot(currentTimeWindow).setCircuitBreakNum(0); resourceStat.updateCircuitBreakState(currentTimeWindow, current, target); LOGGER.debug("transit {} current time window {} from {} which start at {} to {}", resource, currentTimeWindow, current, stateStartTime, target); return true; diff --git a/fizz-core/src/test/java/we/stats/circuitbreaker/CircuitBreakManagerTests.java b/fizz-core/src/test/java/we/stats/circuitbreaker/CircuitBreakManagerTests.java index 543d4f5..ffccdf9 100644 --- a/fizz-core/src/test/java/we/stats/circuitbreaker/CircuitBreakManagerTests.java +++ b/fizz-core/src/test/java/we/stats/circuitbreaker/CircuitBreakManagerTests.java @@ -92,8 +92,8 @@ public class CircuitBreakManagerTests { ResourceStat resourceStat = flowStat.getResourceStat(cb.resource); TimeSlot timeSlot = resourceStat.getTimeSlot(currentTimeWindow); - timeSlot.getCompReqs().set(200); - timeSlot.getErrors().set(11); + timeSlot.setCompReqs(200); + timeSlot.setErrors(11); boolean permit = circuitBreakManager.permit(mockServerWebExchange, currentTimeWindow, flowStat, service, path); Assertions.assertFalse(permit); @@ -101,6 +101,6 @@ public class CircuitBreakManagerTests { permit = circuitBreakManager.permit(mockServerWebExchange, currentTimeWindow, flowStat, service, path); Assertions.assertFalse(permit); Assertions.assertEquals(CircuitBreaker.State.OPEN, timeSlot.getCircuitBreakState().get()); - Assertions.assertEquals(2, timeSlot.getCircuitBreakNum().get()); + Assertions.assertEquals(2, timeSlot.getCircuitBreakNum()); } }