Limitación de velocidad de un flujo de archivo de rubí
-
20-09-2019 - |
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.
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.