2017-07-15 65 views
0

由用户使用的JAVA 7脱机软件会在用户早晨运行时自动将备份发送到云。每个发送的备份消耗服务器带宽。见下图:推迟访问服务器以尽量避免高峰时间

enter image description here

可以注意到,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(); 
+0

一个应用程序发送到服务器的备份大小是多少? –

+0

备份大小在500KB到4MB之间变化。 – viniciussss

+0

如果成千上万的用户正在上传备份到相同的服务器,okk。你应该考虑在你的服务器上使用负载平衡器。这样你就不需要改变软件中的算法。或者如果在将备份上传到云之前仍然需要实施,则应请求服务器了解是否有足够的带宽供您上传。有许多方法可以通过编程方式在服务器端检查带宽 –

回答

1

有几种不同的方法可以解决这个问题。您可以做一个稍微有点琐碎的协议,客户端首先请求备份并等待服务器响应服务器允许他们上传数据,从而允许服务器在高负载时排队某些客户端。

执行此操作的一种方法是发送408请求超时,然后写入客户端以在延迟后再次尝试。

另一个想法是使用明确的thread pool来处理请求,以便在任何给定时间处理的客户端数量都有保证的限制。一般来说,大多数Web服务器都会有一种配置方式,如maxThreads option on Tomcat

随机问题可能不是一个好主意,因为分布式系统倾向于提供一个非常大的样本量,因此即使看似罕见的事件也不可避免。

1

不好。从繁忙时段开始,您的延迟用户最终可能会成为服务器的最高点。即使没有必要,一些用户也会被延迟。

虽然随机化使峰值平平一点,但它肯定不是好主意。简单地询问服务器是否可以处理请求是简单而有效的。它不需要是一个单独的请求,HTTP状态503 Service Unavailable是专门用于这种情况。您的客户应在几分钟后重试。

虽然随机分布使峰值趋于平缓,但询问服务器是随着时间的推移完全保持恒定利用率的唯一途径。

注意,目前的带宽低于1 MB/s,这比我的IP提供商提供了一个标准的私人家庭连接百倍。您可以使用负载平衡器,或者只需让客户端从服务器池中进行选择,如果它对于一台服务器来说太多了。但是,一台服务器应该容易饱和磁盘带宽,这对于旧的硬盘来说大约是50 MB/s = 400 Mb/s。

+0

你说得对。我想的方式最终会在同一时间发送备份高峰。但是如果我遵循Mcdowella的建议,我认为这将有助于沿着10分钟的时间间隔很好地分发备份。我知道这并不完美,因为用户有不同的备份大小和不同的带宽速度,但这足够了。毕竟,根据我的数学,我将平均分配9 MBps。 – viniciussss

+1

当然,但我建议问问服务器,无论如何,因为它更有前途。你可能会得到10倍的用户或多台服务器,有些服务器可能会失败......并且询问他们会一直告诉你该怎么做。 '+++'此外,随机分布仍然有一些高峰和低谷,所以你的服务器不会被完美地利用。 – maaartinus