Лучшая технология для настройки кеша аудиофайлов - PullRequest
1 голос
/ 10 апреля 2009

У нас есть клиентское приложение, которое позволяет пользователям загружать аудиофайлы в формате MP3 с полной длиной 192 Кбит / с. Поскольку файлы хранятся для нас как для бизнеса, мы должны иметь возможность:

1) Скопировать файл из внешнего хранилища в локальный кеш Сервера

2) Скопируйте этот файл клиенту, который его запросил

Очевидно, что дальнейшие запросы к тому же файлу будут поступать из кеша и не будут нуждаться во внешнем.

Теперь у нас уже есть текущая система, которая делает это (использует Squid Cache), но проблема в том, что 2 выполняется только после полного завершения 1. Это означает, что если для 10-минутной дорожки со скоростью 192 Кбит / с требуется 75 секунд для копирования из внешнего расположения в кэш, тайм-аут клиента HTTP начинается примерно через 60 секунд! Это не соответствует нашим требованиям.

Кажется, что нам нужен кеш, который может передавать клиенту, пока он получает данные из внешнего местоположения. И мои вопросы:

1) Можно ли это сделать с помощью Squid Cache (это наследие, а не мой выбор)?

2) Если нет, то какая технология будет наиболее подходящей для такого сценария (стоимость на самом деле не проблема)?

Пожалуйста, дайте мне знать, если это не понятно в любом случае!

1 Ответ

1 голос
/ 10 апреля 2009

Вот обработчик asp.net, который я написал некоторое время назад, чтобы прокси некоторые вещи с другого сервера. Это не будет так сложно записать в файл и использовать файл во второй раз. Сброс ответа в цикле приведет к его доставке при загрузке:

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;
            }
        }
    }
}
...