【发布时间】:2017-07-15 14:31:52
【问题描述】:
数千人使用的 JAVA 7 离线软件会在用户早上运行时自动将备份发送到云端。每个发送的备份都会消耗服务器带宽。见下表:
可以注意到,08:15 AM 到 09:45 AM 之间形成了一个高峰。这是因为大多数用户在此时间间隔之间运行软件。
我们需要更改软件,使其每 10 分钟向云端发送一次备份。这将大大增加带宽消耗,我们担心会达到一些限制,因为许多用户在同一高峰时间运行该软件。
作为一种解决方法,我们计划将第一次备份随机推迟到服务器。但是,我们并不认为这是一个好的解决方案。
这类问题常见吗?有没有标准的解决方案?
这是我们正在考虑的算法,但我们不相信这是一个好的解决方案:
new Thread(new Runnable(){
@Override
public void run(){
String hhmmNow = new SimpleDateFormat("HH:mm")
.format(Calendar.getInstance().getTime());
if( hhmmNow.compareTo("08:15")>=0 && hhmmNow.compareTo("09:45")<=0 ){
Thread.sleep(new Random().nextInt(3600000)); //Sleep from 0 to 1h
}
while(true){
sendBackupToTheCloud();
Thread.sleep(600000); //Sleep 10 minutes
}
}
}).start();
编辑: 根据 Mcdowella 的建议改为以下解决方案:
new Thread(new Runnable(){
@Override
public void run(){
int periodicity = 10 * 60 * 1000;
//Randon sleep between 0 and 10 minutes to
//distribute backups within the ten-minute interval.
Thread.sleep(new Random().nextInt(periodicity));
//Send new backup to server every 10 minutes
while(true){
sendBackupToTheCloud();
Thread.sleep(periodicity);
}
}
}).start();
【问题讨论】:
-
一个应用发送到服务器的备份大小是多少?
-
备份大小在 500KB 到 4MB 之间变化。
-
ok,如果成千上万的用户正在将备份上传到同一台服务器。您应该考虑在您的服务器上使用负载平衡器。这样您就无需更改软件中的算法。或者如果您仍然需要实施,那么在将备份上传到云之前,您应该请求服务器了解是否有足够的带宽可供您上传。有办法通过编程检查服务器端的带宽
-
如果您有日志可以告诉您用户何时上传特定日期的备份,您可以使用这些日志来计算当天任何特定睡眠策略的结果。我倾向于总是随机睡眠,但最多只能睡 10 分钟。然后每个用户都有可能在每 10 分钟重复一次的时间表内选择任何给定的时间段。
-
@mcdowella 您的评论帮了很多忙。我没有使用日志,而是使用当前存储的备份的总大小、每个用户的平均备份数量以及每个用户在一天中打开软件的平均时间。另外,我会按照你的建议睡 0 到 10 分钟。我明白你的意思,我需要在 10 分钟的间隔内分配用户。我也理解对方的建议,但实施起来比较复杂,我没有必要的技能。我做了数学计算,麦克道拉的建议就足够了。
标签: java algorithm optimization bandwidth