2017-07-15 12 views
0

Un logiciel hors ligne JAVA 7 utilisé par des milliers envoie automatiquement une sauvegarde au cloud lorsque les utilisateurs l'exécutent le matin. Chaque sauvegarde envoyée consomme de la bande passante serveur. Voir le tableau ci-dessous:Retarder l'accès au serveur pour éviter les heures de pointe

enter image description here

On peut remarquer qu'une forme de pointe entre 8h15 et 09h45. C'est parce que la plupart des utilisateurs exécutent le logiciel entre cet intervalle de temps.

Nous devons changer le logiciel pour qu'il envoie une sauvegarde au cloud toutes les 10 minutes. Cela augmentera considérablement la consommation de bande passante et nous avons peur que nous atteignions une limite parce que de nombreux utilisateurs utilisent le logiciel au même moment. Pour contourner le problème, nous prévoyons de reporter au hasard la première sauvegarde sur le serveur. Cependant, nous ne sommes pas convaincus que c'est une bonne solution.

Ce type de problème est-il commun? Y a-t-il une solution standard pour cela?


Voici l'algorithme de la façon dont nous pensons à le faire, mais nous ne sommes pas convaincus qu'il est une bonne solution:

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(); 

EDIT:Modifié à la solution suivante, selon la suggestion 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

Quelle est la taille de la sauvegarde qu'une application envoie au serveur? –

+0

La taille des sauvegardes varie entre 500 Ko et 4 Mo. – viniciussss

+0

okk si des milliers d'utilisateurs téléchargent une sauvegarde sur le même serveur. vous devriez envisager d'utiliser des équilibreurs de charge sur votre serveur. De cette façon, vous n'aurez pas besoin de changer l'algo dans le logiciel. ou si vous devez encore l'implémenter avant de télécharger la sauvegarde sur le cloud, vous devez demander au serveur de savoir si la bande passante disponible est suffisante pour le téléchargement. Il existe des moyens de vérifier la bande passante à la fin du serveur par programmation –

Répondre

1

Il existe plusieurs façons de résoudre ce problème. Vous pouvez faire un protocole légèrement bavard où les clients demandent d'abord une sauvegarde et attendent la réponse du serveur à partir du serveur, ce qui leur permet de télécharger leurs données, permettant ainsi au serveur de mettre en file d'attente certains clients en cas de charge élevée. L'une des façons de procéder consiste à envoyer un délai d'attente de requête 408, puis à écrire sur le client pour réessayer après un délai.

Une autre idée consisterait à utiliser un thread pool explicite pour gérer les demandes de sorte qu'il existe une limite garantie sur le nombre de clients traités à un moment donné. Généralement, la plupart des serveurs Web auront un moyen de configurer ceci comme le maxThreads option on Tomcat.

La randomisation n'est probablement pas une bonne idée comme suggéré dans la question parce que les systèmes distribués ont tendance à fournir une taille d'échantillon extrêmement grande de sorte que même des événements apparemment rares deviennent inévitables.

1

Pas de problème. Vos utilisateurs retardés depuis le début de l'heure chargée peuvent finir par être serveur au point le plus haut du pic. Certains utilisateurs seront retardés même si ce n'est pas nécessaire.

Alors que la randomisation aplatit un peu le pic, ce n'est sûrement pas une bonne idée. Demander simplement au serveur s'il peut gérer la demande est simple et plus efficace. Il n'a pas besoin d'être une requête séparée, le statut HTTP 503 Service Unavailable est destiné exactement à un tel cas. Votre client devrait réessayer après quelques minutes. Alors qu'une distribution randomisée aplatit les pics, demander au serveur est le seul moyen d'une utilisation parfaitement constante dans le temps.

Notez que la bande passante actuelle est inférieure à 1 Mb/s, ce qui est cent fois moins que ce que mon fournisseur IP offre une connexion à domicile privé norme . Vous pouvez utiliser un équilibreur de charge ou simplement laisser le client choisir parmi un groupe de serveurs, si c'est trop pour un serveur. Cependant, un seul serveur devrait facilement saturer la bande passante du disque qui est quelque chose comme 50 Mo/s = 400 Mb/s pour un ancien disque dur.

+0

Vous avez raison. La façon dont je pensais se retrouverait avec des pics de sauvegardes envoyées en même temps. Mais si je suis la suggestion de Mcdowella, je pense que cela aidera à bien répartir les sauvegardes le long de l'intervalle de 10 minutes. Je sais que ce n'est pas parfait, car il existe différentes tailles de sauvegarde et différentes vitesses de bande passante des utilisateurs, mais cela suffira. Après tout, selon mes calculs, je finirai avec une moyenne de 9 Mbps distribués. – viniciussss

+1

Bien sûr, mais je recommande de demander au serveur, de toute façon, car il est beaucoup plus à l'épreuve du futur. Vous pouvez obtenir 10 fois plus d'utilisateurs ou plusieurs serveurs, certains serveurs peuvent échouer ... et leur demander vous dira toujours ce qu'il faut faire. '+++' De plus, une distribution randomisée a toujours des pics et des creux, donc votre serveur ne sera pas utilisé parfaitement. – maaartinus