由用户使用的JAVA 7脱机软件会在用户早晨运行时自动将备份发送到云。每个发送的备份消耗服务器带宽。见下图:推迟访问服务器以尽量避免高峰时间
可以注意到,08:15上午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之间变化。 – viniciussss
如果成千上万的用户正在上传备份到相同的服务器,okk。你应该考虑在你的服务器上使用负载平衡器。这样你就不需要改变软件中的算法。或者如果在将备份上传到云之前仍然需要实施,则应请求服务器了解是否有足够的带宽供您上传。有许多方法可以通过编程方式在服务器端检查带宽 –