2010-03-15 55 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