Pregunta

Estoy trabajando en un proyecto que consiste en cargar los archivos de vídeo flash a un depósito de S3 a partir de una serie de nodos distribuidos geográficamente.

Los archivos de vídeo están a punto 2-3mb cada uno, y que están enviando sólo un archivo (por nodo) cada diez minutos, sin embargo, el ancho de banda que consumen las necesidades que se limita a tasa ~ 20k / s, ya que estos nodos se entrega transmitiendo medios de comunicación para un CDN, y debido a los lugares a los que sólo son capaces de obtener 512k de subida máx.

He estado buscando en la gema ASW-S3 y si bien no ofrece ningún tipo de limitación de velocidad Soy consciente de que se puede pasar en una corriente IO. Dada esta Me pregunto si podría ser posible crear un flujo continuo de velocidad limitada en el cual reemplaza el método read, añade en la lógica limitación de velocidad (por ejemplo, en su forma más simple, una llamada a sleep entre lecturas) y luego llamar a la super el método reemplazado.

Otra opción que consideré es la piratería el código de Net :: HTTP y poner la limitación de velocidad en el método send_request_with_body_stream que está utilizando un bucle while, pero no estoy del todo seguro de lo que sería la mejor opción.

He intentado extender la clase IO, sin embargo, que no funciona en absoluto, sólo tiene que hereda de la clase con class ThrottledIO < IO no hacer nada.

Cualquier sugerencias serán muy apreciados.

¿Fue útil?

Solución

Es necesario utilizar Delegado si quiere "aumentar" una OI. Esto pone una "fachada" en torno a su objeto de IO que será utilizado por todos los lectores "externos" del objeto, pero no tendrá ningún efecto sobre el funcionamiento del propio objeto.

he extraído que en una joya, ya que resultó ser generalmente útil

Este es un ejemplo de una organización internacional que consigue leído desde

http://rubygems.org/gems/progressive_io

Aquí hay un aspecto añadido a todos los métodos de lectura. Creo que podría ser capaz de extender el proceso a hacer estrangulamiento básico. Después de que haya terminado usted será capaz de envolver su, digamos, del archivo, en él:

 throttled_file = ProgressiveIO.new(some_file) do | offset, size |
    # compute rate and if needed sleep()
 end

Otros consejos

Hemos utilizado el de aiaio active_resource_throttle para limitar las solicitudes de tirar de la API de la cosecha en un proyecto en el trabajo. Yo no ponerla en marcha, pero funciona.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top