2010-03-15 2 views
3

Je travaille sur un projet qui consiste à télécharger des fichiers vidéo flash dans un compartiment S3 à partir d'un certain nombre de nœuds répartis géographiquement. Les fichiers vidéo font environ 2-3 Mo chacun, et nous n'envoyons qu'un seul fichier (par nœud) toutes les dix minutes, mais la bande passante que nous consommons doit être limitée à ~ 20k/s, car ces nœuds fournissent diffusion en continu vers un CDN, et en raison des emplacements, nous ne sommes en mesure d'obtenir le téléchargement max 512k.Taux de limitation d'un flux de fichiers ruby ​​

J'ai regardé dans la gemme ASW-S3 et tandis qu'il n'offre aucune sorte de limitation de vitesse je suis conscient que vous pouvez passer dans un flux d'E/S. Compte tenu de cela, je me demande s'il pourrait être possible de créer un flux à débit limité qui remplace la méthode read, ajoute dans la logique de limitation de débit (par exemple dans sa forme la plus simple un appel à sleep entre lectures), puis appel au super de la méthode substituée. Une autre option que j'ai envisagée est de pirater le code pour Net :: HTTP et de mettre la limitation de débit dans la méthode send_request_with_body_stream qui utilise une boucle while, mais je ne suis pas sûr que ce soit la meilleure option.

J'ai essayé d'étendre la classe IO, mais cela n'a pas fonctionné du tout, héritant simplement de la classe avec class ThrottledIO < IO n'a rien fait.

Toutes les suggestions seront grandement appréciées.

Répondre

4

Vous devez utiliser Déléguer si vous voulez "augmenter" un E/S. Cela met une "façade" autour de votre objet IO qui sera utilisée par tous les lecteurs "externes" de l'objet mais n'aura aucun effet sur le fonctionnement de l'objet lui-même.

J'ai extrait que dans un petit bijou car il est avéré être généralement utile

Voici un exemple pour un IO qui est lu à partir

http://rubygems.org/gems/progressive_io

Ici, il y a un aspect ajouté à tous méthodes de lecture. Je pense que vous pourriez être en mesure d'étendre cela pour faire des restrictions de base. Une fois que vous avez terminé, vous serez en mesure d'envelopper votre, par exemple, fichier, dans celui-ci:

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