Created
July 3, 2025 08:52
-
-
Save Ghost-chu/a13b755ab7f52a6b2025c0f38c15d0ca to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| @NotNull | |
| public SlidingWindowDynamicSpeedLimiter tweakSpeedLimiterBySlidingWindow(@Nullable String downloader, @NotNull DownloaderSpeedLimiter currentSetting, | |
| long thresholdBytes, long minSpeedBytesPerSecond, long maxSpeedBytesPerSecond) throws Exception { | |
| SlidingWindowDynamicSpeedLimiter slidingWindowDynamicSpeedLimiter = new SlidingWindowDynamicSpeedLimiter(); | |
| slidingWindowDynamicSpeedLimiter.setThreshold(thresholdBytes); | |
| slidingWindowDynamicSpeedLimiter.setMaxSpeed(maxSpeedBytesPerSecond); | |
| slidingWindowDynamicSpeedLimiter.setMinSpeed(minSpeedBytesPerSecond); | |
| // 假设滑动窗口为24小时 | |
| long windowSizeMillis = 24 * 60 * 60 * 1000; // 24小时(毫秒) | |
| slidingWindowDynamicSpeedLimiter.setWindowSizeMillis(windowSizeMillis); | |
| long currentTime = System.currentTimeMillis(); | |
| long windowStartTime = currentTime - windowSizeMillis; | |
| slidingWindowDynamicSpeedLimiter.setWindowStartTime(windowStartTime); | |
| Timestamp startTimestamp = new Timestamp(windowStartTime); | |
| Timestamp endTimestamp = new Timestamp(currentTime); | |
| // 获取窗口内的流量数据 | |
| List<TrafficDataComputed> trafficData = downloader == null ? getAllDownloadersOverallData(startTimestamp, endTimestamp) : getSpecificDownloaderOverallData(downloader, startTimestamp, endTimestamp); | |
| // 计算窗口内的总上传流量 | |
| long totalUploadedBytes = trafficData.stream() | |
| .mapToLong(TrafficDataComputed::getDataOverallUploaded) | |
| .sum(); | |
| slidingWindowDynamicSpeedLimiter.setUploadedInWindow(totalUploadedBytes); | |
| // 获取当前速度限制 | |
| long currentSpeedLimit = currentSetting.upload(); | |
| slidingWindowDynamicSpeedLimiter.setOldSpeedLimit(currentSpeedLimit); | |
| long newSpeed; | |
| if (totalUploadedBytes >= thresholdBytes) { | |
| // 应用节流策略 - 当达到或超过阈值时 | |
| if (currentSpeedLimit <= minSpeedBytesPerSecond) { | |
| newSpeed = minSpeedBytesPerSecond; | |
| slidingWindowDynamicSpeedLimiter.setReachedMinimumSpeed(true); | |
| } else { | |
| // 计算减少因子 b = l_current / l | |
| double b = (double) totalUploadedBytes / thresholdBytes; | |
| newSpeed = (long) (currentSpeedLimit / b); | |
| // 确保不低于最小速度 | |
| newSpeed = Math.max(newSpeed, minSpeedBytesPerSecond); | |
| slidingWindowDynamicSpeedLimiter.setDecreaseFactor(b); | |
| } | |
| } else { | |
| // 应用解除节流策略 - 当未达到阈值时 | |
| if ((currentSpeedLimit >= maxSpeedBytesPerSecond) && maxSpeedBytesPerSecond > 0) { | |
| newSpeed = maxSpeedBytesPerSecond; | |
| } else { | |
| // 计算增加因子 a = (l - l_current) / w,并转换为每秒字节数 | |
| double a = (double) (thresholdBytes - totalUploadedBytes) / windowSizeMillis * 1000; | |
| newSpeed = (long) (currentSpeedLimit + a); | |
| // 确保不超过最大速度 | |
| newSpeed = Math.min(newSpeed, maxSpeedBytesPerSecond); | |
| slidingWindowDynamicSpeedLimiter.setIncreaseFactor(a); | |
| } | |
| } | |
| slidingWindowDynamicSpeedLimiter.setNewSpeedLimit(newSpeed); | |
| if (slidingWindowDynamicSpeedLimiter.getNewSpeedLimit() < 1) { // 0 = 无限制 | |
| slidingWindowDynamicSpeedLimiter.setNewSpeedLimit(1L); | |
| } | |
| // 创建并返回新的速度限制设置 | |
| return slidingWindowDynamicSpeedLimiter; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment