Ограничение скорости потока файла ruby - PullRequest
3 голосов
/ 15 марта 2010

Я работаю над проектом, который включает загрузку флеш-видеофайлов в корзину S3 с нескольких географически распределенных узлов.

Размер видеофайлов составляет около 2-3 МБ каждый, и мы отправляем только один файл (на узел) каждые десять минут, однако потребляемая пропускная способность должна быть ограничена скоростью ~ 20 К / с, поскольку эти узлы обеспечивают потоковую передачу. мультимедиа в CDN, и из-за местоположения мы можем получить максимум 512 тыс. загрузок.

Я изучал драгоценный камень ASW-S3, и хотя он не предлагает какого-либо ограничения скорости, я знаю, что вы можете передавать в IO Stream. Учитывая это, мне интересно, возможно ли создать поток с ограниченной скоростью, который переопределяет метод read, добавляет логику ограничения скорости (например, в простейшей форме - вызов sleep между чтениями) и затем вызывает супер переопределенного метода.

Другой вариант, который я рассмотрел, - это взлом кода для Net :: HTTP и помещение ограничения скорости в метод send_request_with_body_stream, использующий цикл while, но я не совсем уверен, какой из них будет лучшим.

Я пытался расширить класс IO, однако это не сработало вообще, просто наследование от класса с помощью class ThrottledIO < IO ничего не сделало.

Любые предложения будут с благодарностью.

Ответы [ 2 ]

4 голосов
/ 15 марта 2010

Вам нужно использовать Delegate, если вы хотите «увеличить» IO. Это помещает «фасад» вокруг вашего объекта ввода-вывода, который будет использоваться всеми «внешними» считывателями объекта, но не будет влиять на работу самого объекта.

Я извлек это в драгоценный камень, поскольку он оказался в целом полезным

Вот пример ввода-вывода, который читается из

http://rubygems.org/gems/progressive_io

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

 throttled_file = ProgressiveIO.new(some_file) do | offset, size |
    # compute rate and if needed sleep()
 end
0 голосов
/ 15 марта 2010

Мы использовали active_resource_throttle aiaio для ограничения запросов на извлечение из API Harvest для проекта на работе. Я не настроил его, но он работает.

...