2010-03-15 41 views
3

我正在從事一個項目,該項目涉及將Flash視頻文件從許多地理分佈的節點上傳到S3存儲桶。限制紅寶石文件流

每個視頻文件大約2-3mb,我們每十分鐘只發送一個文件(每個節點),但是我們消耗的帶寬需要限制在20k/s左右,因爲這些節點正在傳輸流媒體到CDN,由於我們的位置,我們只能獲得最大512k的上傳。

我一直在研究ASW-S3 gem,雖然它不提供任何種類的速率限制,但我知道您可以傳入IO流。鑑於此,我想知道是否有可能創建一個覆蓋方法的速率限制流,添加速率限制邏輯(例如以最簡單的形式在讀取之間調用sleep),然後調用超級函數重寫的方法。

我考慮的另一個選擇是竊取Net :: HTTP的代碼,並將速率限制放入使用while循環的send_request_with_body_stream方法中,但我並不完全確定哪個是最佳選項。

我試圖在擴展IO類,但是根本不起作用,只是從類繼承class ThrottledIO < IO沒有做任何事情。

任何建議將不勝感激。

回答

4

如果您想「擴充」IO,則需要使用委託。這將在您的IO對象周圍放置一個「外觀」,該對象將被對象的所有「外部」閱讀器使用,但不會影響對象本身的操作。

我已經提取的成寶石,因爲它被證明是普遍有用

下面是一個IO的例子會從

http://rubygems.org/gems/progressive_io

讀到這裏有一個方面添加到所有閱讀方法。我想你可能會擴展到做基本的限制。完成後,您將能夠將您的文件包裝到其中:

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