Frage

Ich arbeite an einem Projekt, bei dem Flash -Videodateien aus einer Reihe geografisch verteilter Knoten in einen S3 -Bucket hochgeladen werden.

Die Videodateien sind jeweils etwa 2-3 MB, und wir senden nur eine Datei (pro Knoten) alle zehn Minuten. Die Bandbreite, die wir konsumieren CDN und aufgrund der Standorte können wir nur 512K -Max -Upload erhalten.

Ich habe mich mit dem ASW-S3-Juwel befasst und obwohl es keine Ratenbeschränkung bietet, bin ich mir bewusst, dass Sie in einem IO-Stream passieren können. Angesichts dessen frage ich mich, ob es möglich sein könnte, einen preisbegrenzten Stream zu erstellen, der das überschreibt read Methode, fügt die ratebegrenzende Logik hinzu (z. B. in ihrer einfachsten Form eines Aufrufs an sleep zwischen den Lesevorgängen) und rufen Sie dann zum Super der überschriebenen Methode auf.

Eine andere Option, die ich in Betracht gezogen habe, ist das Hacken des Codes für Net :: HTTP und die Einschränkung der Rate in die send_request_with_body_stream Methode, die a verwendet while Schleife, aber ich bin mir nicht ganz sicher, welches die beste Option wäre.

Ich habe versucht, die IO -Klasse zu erweitern, aber das hat überhaupt nicht funktioniert, einfach von der Klasse mit der Klasse erbte class ThrottledIO < IO Hat nichts getan.

Alle Vorschläge werden sehr geschätzt.

War es hilfreich?

Lösung

Sie müssen Delegate verwenden, wenn Sie ein IO "erweitern" möchten. Dies legt eine "Fassade" um Ihr IO -Objekt, das von allen "externen" Lesern des Objekts verwendet wird, hat jedoch keinen Einfluss auf den Betrieb des Objekts selbst.

Ich habe das in ein Edelstein extrahiert, da es sich als allgemein nützlich erwies

Hier ist ein Beispiel für ein IO, aus dem gelesen wird

http://rubygeems.org/gesems/progressive_io

Hier wird allen Lesemethoden einen Aspekt hinzugefügt. Ich denke, Sie können dies möglicherweise für das grundlegende Droseln ausdehnen. Nachdem Sie fertig sind, können Sie Ihre Datei beispielsweise in sie einwickeln:

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

Andere Tipps

Wir haben die benutzt AIOIO Active_Resource_Throttle Begrenzung von Anfragen von der Ernte -API für ein Projekt bei der Arbeit. Ich habe es nicht eingerichtet, aber es funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top