限制ruby文件流的速率

时间:2010-03-15 14:03:57

标签: ruby stream throttling rate-limiting

我正在开展一个项目,该项目涉及将Flash视频文件从多个地理位置分散的节点上传到S3存储桶。

每个视频文件大约2-3mb,我们每十分钟只发送一个文件(每个节点),但我们消耗的带宽需要限制在~20k / s,因为这些节点正在提供流媒体到CDN,由于位置我们只能获得512k最大上传。

我一直在研究ASW-S3 gem,虽然它没有提供任何速率限制,但我知道你可以传入IO Stream。鉴于此,我想知道是否有可能创建一个覆盖read方法的速率限制流,添加速率限制逻辑(例如,以最简单的形式在读取之间调用sleep)然后调用覆盖方法的超级。

我考虑的另一个选项是攻击Net :: HTTP的代码并将速率限制放入使用send_request_with_body_stream循环的while方法,但我不完全确定哪个是最好的选择。

我试图扩展IO类,但是根本不起作用,只是从具有class ThrottledIO < IO的类继承没有做任何事情。

任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:4)

如果要“扩充”IO,则需要使用Delegate。这会在IO对象周围放置一个“Facade”,该对象将被对象的所有“外部”读者使用,但不会对对象本身的操作产生影响。

我已将其提取到宝石中,因为它被证明通常是有用的

以下是从

读取的IO的示例

http://rubygems.org/gems/progressive_io

这里有一个方面添加到所有阅读方法。我想你可以扩展它来进行基本的限制。完成后,您将能够将您的文件包装到其中:

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

答案 1 :(得分:0)

我们使用aiaio's active_resource_throttle来限制在工作项目中从Harvest API中提取请求。我没有设置它,但它确实有效。