2009-04-10 3 views
1

Nous avons une application client qui permet aux utilisateurs de télécharger des fichiers audio MP3 de 192 Ko/s. Étant donné que les fichiers sont stockés pour nous à l'extérieur comme une entreprise, nous devons être en mesure de:Meilleure technologie à utiliser pour configurer un cache de fichiers audio

1) Copiez le fichier de l'emplacement externe dans un cache local du serveur

2) Copier ce fichier au client qui l'a demandé

De toute évidence, d'autres requêtes sur le même fichier proviendraient du cache et n'auraient pas besoin d'être externes.

Maintenant, nous avons déjà un système actuel qui le fait (en utilisant un cache Squid), mais le problème est que 2 ne s'exécute que lorsque 1 est complètement terminé. Cela signifie que si une piste de 192 kb/s de 10 minutes requiert 75 secondes pour être copiée depuis un emplacement externe dans le cache, le délai d'attente HTTP du client est d'environ 60 secondes! Cela ne remplit pas nos exigences.

Il semble que nous ayons besoin d'un cache pouvant être transféré à un client PENDANT qu'il reçoit des données d'un emplacement externe. Et mes questions sont:

1) Est-ce que cela peut être fait avec un Squid Cache (c'est l'ancien titulaire et pas mon choix)? 2) Dans la négative, quelle technologie serait la plus adaptée à ce type de scénario (le coût n'est pas vraiment un problème)?

S'il vous plaît laissez-moi savoir si ce n'est pas clair en aucune façon!

Répondre

1

Voici un gestionnaire asp.net que j'ai écrit il y a quelques temps pour transmettre des données à partir d'un autre serveur. Ce ne serait pas si difficile d'écrire dans un fichier et d'utiliser le fichier une seconde fois. Le vidage de la réponse dans la boucle la rendrait disponible lors du téléchargement:

namespace bla.com 
{ 
    /// <summary> 
    /// Summary description for $codebehindclassname$ 
    /// </summary> 
    [WebService(Namespace = "http://tempuri.org/")] 
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
    public class Proxy : IHttpHandler 
    { 
     private static Regex urlRegex=new Regex(@"http://some_regex_here_to_prevent_abuse_of_proxy.mp3",RegexOptions.Compiled); 
     public void ProcessRequest(HttpContext context) 
     { 
      var targetUrl = context.Request.QueryString["url"]; 
      MatchCollection matches = urlRegex.Matches(targetUrl); 

      if (matches.Count != 1 || matches[0].Value != targetUrl) 
      { 
       context.Response.StatusCode = 403; 
       context.Response.ContentType = "text/plain"; 
       context.Response.Write("Forbidden"); 
       return; 
      } 

      HttpWebRequest req = (HttpWebRequest) WebRequest.Create(targetUrl); 
      Stream responseStream; 
      using (HttpWebResponse response = (HttpWebResponse)req.GetResponse()) 
      { 
       responseStream = response.GetResponseStream(); 
       context.Response.ContentType = response.ContentType; 

       byte[] buffer = new byte[4096]; 
       int amt; 
       while ((amt = responseStream.Read(buffer, 0, 4096))>0) 
       { 

        context.Response.OutputStream.Write(buffer, 0, amt); 
        Debug.WriteLine(amt); 
       } 
       responseStream.Close(); 
       response.Close(); 
      } 
      context.Response.Flush(); 
     } 

     public bool IsReusable 
     { 
      get 
      { 
       return false; 
      } 
     } 
    } 
} 
+0

Vous pouvez également augmenter la longueur du délai d'attente pour autoriser les fichiers plus volumineux. –

Questions connexes