Skip to content

Instantly share code, notes, and snippets.

@Ghost-chu
Created July 3, 2025 08:52
Show Gist options
  • Select an option

  • Save Ghost-chu/a13b755ab7f52a6b2025c0f38c15d0ca to your computer and use it in GitHub Desktop.

Select an option

Save Ghost-chu/a13b755ab7f52a6b2025c0f38c15d0ca to your computer and use it in GitHub Desktop.
@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