Domanda

Sto lavorando su un progetto che coinvolge i file video caricato flash per un secchio S3 da un certo numero di nodi geograficamente distribuite.

I file video sono circa 2-3MB ciascuno, e ci sono solo l'invio di un file (per nodo) ogni dieci minuti, ma la larghezza di banda che consumiamo ha bisogno di essere limitata a tasso ~ 20K / s, in quanto questi nodi sono offrendo in streaming media per una CDN, e grazie alle posizioni che sono in grado di ottenere 512k massimo di upload solo.

Ho cercato nella gemma ASW-S3 e mentre non offre alcun tipo di limitazione della velocità mi rendo conto che è possibile passare in un IO Stream. Dato questo mi chiedo se potrebbe essere possibile creare un flusso di rate limitata, che ridefinisce il metodo read, aggiunge nella logica limitante tasso (ad esempio, nella sua forma più semplice, una chiamata a sleep tra le letture) e poi chiamare al super di il metodo override.

Un'altra opzione ho considerato è hacking del codice per Net :: HTTP e mettendo il fattore limitante nel metodo send_request_with_body_stream che sta usando un ciclo while, ma non sono del tutto sicuro che sarebbe l'opzione migliore.

Ho tentato di estendere la classe IO, tuttavia, che non ha funzionato affatto, semplicemente che eredita dalla classe con class ThrottledIO < IO non ha fatto nulla.

Ogni suggerimento sarà molto apprezzato.

È stato utile?

Soluzione

È necessario utilizzare Delegato se si vuole "aumentare" un IO. Questo pone una "facciata" intorno al vostro oggetto IO che saranno utilizzati da tutti i lettori "esterni" dell'oggetto, ma non avrà alcun effetto sul funzionamento dell'oggetto stesso.

Ho estratto che in un gioiello in quanto ha dimostrato di essere utile in generale

Ecco un esempio di un IO che viene letta da

http://rubygems.org/gems/progressive_io

Qui c'è un aspetto aggiunto a tutti i metodi di lettura. Credo che si potrebbe essere in grado di estendere che fare limitazione di base. Dopo aver finito si sarà in grado di avvolgere il vostro, per esempio, file, in esso:

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

Altri suggerimenti

Abbiamo utilizzato il di aiaio active_resource_throttle per limitare le richieste di tirare dal API raccolto su un progetto di al lavoro. Io non impostare il tutto, ma funziona.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top