среда, 18 ноября 2009 г.

Делаем файлообменник [3: Отдача файла]

Здесь теория, потому как это ещё не готово.

В общем, при отдаче нужно:

  • Проверять, имеет ли этот пользователь право скачивать этот файл
  • Проверять, не идёт ли этому пользователю отдача этого или другого файла
  • Ограничивать скорость отдачи
Основаная проблема здесь - при ограничении скорости отдачи мы получим большое количество одновременных соединений, что при стандартной для большинства веб-серверов pre-fork модели приведёт к большому количество процессов веб-сервера, а значит к расходу оперативки и замедлению работы системы (из-за повышенных расходов на планирование приоритетов и переключение процессов).

Обычно для таких задач используют сервер, построенный по модели конечного автомата(автоматное программирование). В этом случае один процесс сможет эффективно обслуживать большое количество соединений. Для своей реализации я нашёл библиотеку на Perl, с помощью которой такой сервер можно достаточно просто написать - пример реализации веб-сервера для отдачи файла (без проверок и ограничения скорости) занимает менее 100 строк кода. Но, ещё раз повторюсь, это всё пока теория, требующая проверки.


Предыдущие части: 1: Планирование, 2: Индикатор загрузки.

10 коммент.:

shuppe комментирует...

имхо, лучше делать как-то так:
положить на порт скажем 8080 сервера какой-нибудь быстрый httpd сервер типа mathopd; про запросе файла создавать в файлсистеме этого сервера линк на файл, и он пускай отдает.
после скачки (или таймаута) линк удаляется

Горбачёв комментирует...

Конечно, этот способ можно использовать. И он гораздо проще. Только вместо порта лучше сделать поддомен на другом IP (не у всех открыт порт отличный от 80).

Я же хочу достичь большей гибкости (вроде изменения скорости скачивания на лету), вот и экспериментирую.

zz комментирует...

ох щит, велосипеды Ж)
nginx все это умеет из коробки, и ограничения количества скорости скачек на пользователя и авторизация хешем, ну и прозреваю он сильно быстрее перла хоты бы файловым вводом выводом :)

Горбачёв комментирует...

nginx все это умеет из коробки
И с БД работать он тоже умеет? ;)

Анонимный комментирует...

Зачем серверу с бд работать? Через fastcgi подключаешь что угодно и там работаешь.

Nginx порвет любое ваше perl-решение на много много порядков (!!).

zz комментирует...

а зачем тебе бд во время отдачи :)

В любом случае X-Accel-Redirect спасет отца русской демократии, дав реализовать на перле логику не заставляя в нем же отдавать файлы :)

Горбачёв комментирует...

Про X-Accel-Redirect не знал, спасибо :)

Андрей Роговский комментирует...

Мндя
И эти люди учат писать файлообменники

Анонимный комментирует...

Интересно следить за развитием проекта, планируете ли выложить готовый результат (код в смысле)?

Горбачёв комментирует...

Пока не планирую - это ведь экспериментальный проект и поддерживать его никакого желания нет.
Какие-то части покажу, но не столько для использования, сколько для совместного обсуждения.